È necessario reimpostare fd_set tra selezionare la chiamata di sistema?

Sto affrontando un problema usando la funzione select in Unix.

Ho un server che aspetta una connessione. Per prima cosa aggiungo il listener descrittore del file socket di ascolto al file fd_set readfds usando FD_SET(listener, readfds) e poi lo uso in select() .

Quando ottengo una connessione, chiamo accept() e imposto i readfds in select con il descrittore di file accettato e inizio a ricevere i dati dalla connessione. Tuttavia, quando controllo il codice in strace, The select non mostra il listener nel readfds mentre select() è in esecuzione una seconda volta.

Devo impostare nuovamente il descrittore di file listener usando FD_SET(listener, readfds) prima di chiamare select() nuovo?

Grazie.

Sì (è necessario ripristinare il fd_set tra le chiamate di sistema select() ).

È una seccatura, ma agiscono come parametri di input / output; vengono letti e modificati dalla chiamata di sistema. Quando select() restituisce, i valori sono stati tutti modificati per riflettere l’insieme dei descrittori di file pronti. Quindi, ogni volta prima di chiamare select() , devi (re) inizializzare i valori di fd_set .

Jonathan ha ragione. È necessario eseguire le seguenti operazioni ogni volta:

 set readFDs set writeFDs set errorFDs select(count_of_FDs, readFDs, writeFDs, errorFDs, timeout)