La chiamata di sistema selezionata è un modo per attendere che i descrittori di file cambino stato mentre i programmi non hanno altro da fare. L'uso principale è per le applicazioni server, che aprono una serie di descrittori di file e quindi attendono qualsiasi cosa da fare (accettare nuove connessioni, leggere richieste o inviare le risposte). Questi descrittori di file verranno aperti in modalità io non bloccante in modo tale che il processo del server non si blocchi in un syscall in qualsiasi momento.
Ciò significa inoltre che non è necessario utilizzare thread separati, poiché tutto il lavoro, che è possibile eseguire nel thread, può essere eseguito anche prima della chiamata selezionata. E se il lavoro richiede molto tempo, che può essere interrotto, selezionare essere chiamato con timeout = {0,0}, i descrittori di file vengono gestiti e in seguito il lavoro viene ripreso.
Ora si chiude un descrittore di file in un'altra discussione. Perché hai quel filo in più e perché chiuderà il descrittore di file?
Lo standard POSIX non fornisce alcun suggerimento, cosa succede in questo caso, quindi quello che stai facendo è UN COMPORTAMENTO NON DEFINITO. Aspettatevi che il risultato sarà molto diverso tra i diversi sistemi operativi e anche tra la versione dello stesso sistema operativo.
saluti, Bodo
fonte
2009-02-13 15:40:17
Possibile duplicato di [estrazione dalla selezione socket] (http://stackoverflow.com/questions/2486727/breaking-out-from-socket-select) – iammilind
Penso che sia diverso, anche se leggermente correlato. L'altra domanda sta chiedendo esplicitamente come uscire da un 'select()' da un altro thread (e 'pipe()' è una buona risposta), mentre il mio era più sul comportamento di 'close()' su un 'select () Presa 'ed. Nelle risposte qui sotto, vedrai che la risposta è "dipende". –
Una delle più misteriose cacce agli insetti che ho seguito si è rivelata dovuta a questo problema: il thread A stava selezionando sul socket #x, quale thread B era chiuso. Poco dopo, il thread C ha creato un nuovo socket, che era anche il socket n. X (perché lo stack di rete ha scelto di riutilizzare il numero x per il nuovo socket). A questo punto il thread A (che stava ancora tentando di usare socket #x) ha ovviamente iniziato a selezionare/leggere/scrivere dati sul socket del thread C, anche se non avevano assolutamente nessuna connessione logica tra loro. Questo è stato un dolore totale da rintracciare. –