pospos | si tu est sous windows tu n'as pas le choix: il faut que tu fasse un select.
Si tu est sous linux tu peux aussi utiliser alarm. par contre apres ca va dependre de la version de perl que tu utilise (safe signals ou pas....) et du coup il vaudra mieux utiliser les signaux posix. Le mieux c'est d'utiliser ce module: Sys::SigAction. il va gerer les conneries de safe/ unsafe et tout de bordel.
Mais dans tous els cas la solution du select est sand doute plus propre:
tu fais ton socket et tu attends qu'il ai kkchose à lire avec un select (ou IO::Select si t'es pas à cheval sur les perfs).
Par contre si tu veux lire une ligne (ou utiliser read au lieu de sysread) tu risque à nouveau de bloquer si il n'y a pas assez de choses à lire. dans ce cas il faut passer aux sockets non bloquants... (et la encore c'est different sous windows et unix!)
tiens voila des functions qui devraient marcher pour ca:
Code :
- use POSIX ();
- use constant WIN32 => $^O =~ /win32/i;
- use constant O_NONBLOCK => &POSIX::O_NONBLOCK;
- use constant F_GETFL => &POSIX::F_GETFL;
- use constant F_SETFL => &POSIX::F_SETFL;
- sub nonblock {
- my $sock = shift;
- if (WIN32) {
- my $set_it = "1";
- ioctl( $sock, 0x80000000 | (4 << 16) | (ord('f') << 8) | 126, $set_it) || return 0;
- } else {
- fcntl($sock, F_SETFL, fcntl($sock, F_GETFL, 0) | O_NONBLOCK) || return 0;
- }
- }
- sub block {
- my $sock = shift;
- if (WIN32) {
- my $set_it = "0";
- ioctl( $sock, 0x80000000 | (4 << 16) | (ord('f') << 8) | 126, $set_it) || return 0;
- } else {
- fcntl($sock, F_SETFL, fcntl($sock, F_GETFL, 0) & ~O_NONBLOCK) || return 0;
- }
- }
|
(j'importe les constantes à la main pasqu'en fait, commme pour bcp de modules basées sur des .h, ce ne sont pas de vraies constantes mais des appels de fonction => en faisant un use constant on est certain d'avoir de vraies belles constantes compilées) |