comment savoir si des données sont attendues en stdin ?
Le
Kobayashi
Bonjour à tous,
J'ai un programme fortran auquel je ne peux
pas toucher qui lit des données sur l'entrée
standard, fait des traitements plus ou moins
longs, puis attend des nouvelles données sur
l'entrée standard. J'aimerais pouvoir savoir
quand des données sont attendues (pour savoir
que le traitement précédent est terminé)
Un petit exemple :
PROGRAM MAIN
WRITE(6,*)'Enter the number of seconds to sleep '
READ(5,*)NUMBER
WRITE(6,*)'Sleeping for ',NUMBER,'seconds'
DO I=0,NUMBER-1
CALL SLEEP(1)
WRITE(6,*)I+1
ENDDO
WRITE(6,*)'Enter a number '
READ(5,*)NUMBER
WRITE(6,*)'Number is: ',NUMBER
END
J'aimerais pouvoir lancer ce programme par une
manière quelconque (system, fork, ) et avoir
un moyen de savoir quand le programme en est aux
lignes "READ" en interrogeant je ne sais quoi
(un super pipe, un fichier de /proc, ). En gros,
je veux quelque chose qui me réponde 1 en arrivant
au premier READ, 0 pendant toute la boucle avec
les sleep, puis 1 en arrivant au second READ.
Je cherche, je cherche mais sans trouver pour le
moment Si quelqu'un a une idée !
Cordialement,
K.
J'ai un programme fortran auquel je ne peux
pas toucher qui lit des données sur l'entrée
standard, fait des traitements plus ou moins
longs, puis attend des nouvelles données sur
l'entrée standard. J'aimerais pouvoir savoir
quand des données sont attendues (pour savoir
que le traitement précédent est terminé)
Un petit exemple :
PROGRAM MAIN
WRITE(6,*)'Enter the number of seconds to sleep '
READ(5,*)NUMBER
WRITE(6,*)'Sleeping for ',NUMBER,'seconds'
DO I=0,NUMBER-1
CALL SLEEP(1)
WRITE(6,*)I+1
ENDDO
WRITE(6,*)'Enter a number '
READ(5,*)NUMBER
WRITE(6,*)'Number is: ',NUMBER
END
J'aimerais pouvoir lancer ce programme par une
manière quelconque (system, fork, ) et avoir
un moyen de savoir quand le programme en est aux
lignes "READ" en interrogeant je ne sais quoi
(un super pipe, un fichier de /proc, ). En gros,
je veux quelque chose qui me réponde 1 en arrivant
au premier READ, 0 pendant toute la boucle avec
les sleep, puis 1 en arrivant au second READ.
Je cherche, je cherche mais sans trouver pour le
moment Si quelqu'un a une idée !
Cordialement,
K.

Poser une question


Kobayashi
Le plus simple en suivant l'exemple ci-dessus serait de surveiller ce
qu'afficher le programme pour détecter les WRITE qui précèdent les READ
(un peu à la manière de 'expect')... Mais j'imagine que ce n'est pas
possible avec le programme réel.
Sinon, via procfs, il y a bien /proc/PID/syscall qui donne comme premier
nombre le numéro de l'appel système en cours. Sur ma machine, on trouve
ces numéros dans /usr/include/asm/unistd_32.h et le 3 correspond à
'read'...
--
Paul Gaborit -
Bonjour,
Essayez de regarder du côté de l'appel système "select(2)", il est fait
exactement pour ça. Extrait du man:
select() and pselect() allow a program to monitor multiple file
descriptors, waiting until one or more of the file descriptors become
"ready" for some class of I/O operation (e.g., input possible). A file
descriptor is considered ready if it is possible to perform the
corresponding I/O operation (e.g., read(2)) without blocking.
Donc, en gros, il vous faut un "wrapper" dans un langage quelconque, qui
possède dans son API une possibilité s'appel à select(). Bien sûr, il y
a le C, mais ça peut aussi être du Perl, par exemple, avec la fonction
IO::Select, ou autre chose encore.
Cordialement,
Bruno
Bonjour Paul,
Effectivement, ce n'est pas possible dans le cas réel.
Merci pour cette piste ... J'ai essayé et il semble que
lorsque le code en est à READ, le syscall est à l'état 0,
bizarre ! En tout état de cause, syscall est à un état
différent pendant le traitement donc c'est une piste
à explorer.
Cordialement,
K.
Bonjour Bruno,
Merci, je vais regarder ceci attentivement !
Cordialement,
K.
Kobayashi
Voici un exemple de sortie de /proc/PID/syscall lorsqu'un programme est
bloqué sur un appel système 'read' :
3 0x0 0x9518178 0x50 0x9518008 0xbffeb1ac 0xbffeb138 0xbffeb114 0x15a422
(ce n'est pas dépendant du langage utilisé.)
Peut-être que l'appel système 'read' vaut 0 sur votre système...
--
Paul Gaborit -