Gestire Sigint nelle chiamate di sistema lenta
-
28-10-2019 - |
Domanda
Sono molto nuovo a Python, quindi perdonami se questa domanda è molto semplice.
Sto cercando di gestire un interrupt della tastiera accettando i dati da una presa utilizzando il modulo Select. Quindi, ho una chiamata di funzione select.select () per attendere i dati dal socket, quindi superarli in console.
Quando premo CTRL_C, sembra che a volte ricevo un'eccezione select.error e talvolta eccezioni. Il codice di errore corrispondente è 4 per entrambe le eccezioni.
Esiste un codice che gestisce la tastiera più in profondità nell'eccezione nello stack di chiamata, quindi quando ottengo un Sigint nella funzione in cui accetto una connessione socket, voglio solo raisere di eccezione da tastiera. Voglio anche catturare eccezioni relative alla connessione.
Sarebbe sicuro verificare il codice di errore di Exception e sollevare la tastiera se è 4? Ciò influenzerà la mia capacità di catturare eccezioni legate alla connessione? Esiste una buona risorsa sui codici di errore?
Grazie!
Soluzione
Uso errno.EINTR
invece. È sicuro.
>>> import errno
>>> errno.EINTR
4
Tuttavia, questo non ti dirà quale segnale ha interrotto la chiamata di sistema, solo quella alcuni Il segnale lo ha interrotto.
Da Man 2 Seleziona:
EBADF An invalid file descriptor was given in one of the sets. (Per‐ haps a file descriptor that was already closed, or one on which an error has occurred.) EINTR A signal was caught; see signal(7). EINVAL nfds is negative or the value contained within timeout is invalid. ENOMEM unable to allocate memory for internal tables.