2009-10-08 9 views
0

Je suis en train d'envoyer et de recevoir l'aide de tuyaux:problème avec O_NONBLOCK pipe

send.cpp

struct 
{ 
     long a; 
     long b; 
}T; 
cout << "1" << endl; 
if (access (FIFO_NAME, F_OK) == -1) { 
      res = mkfifo (FIFO_NAME, 0755); 
      if (res != 0) 
        cout << " Can't make fifo" << endl; 
} 

cout << "2" << endl; 
pipe_fd = open (FIFO_NAME, O_WRONLY); 
cout << "3: " << pipe_fd << endl; 
a=b=1; 
res = write (pipe_fd, &T, sizeof (T)); 
cout << "4" << endl; 
close(pipe_fd); 

recv.cpp

cout << "1" << endl; 
pipe_fd = open(FIFO_NAME, O_RDONLY | O_NONBLOCK); 
cout << "2" << endl; 
res = read(pipe_fd, &T, sizeof(T)); 
cout << T.a << T.b << endl; 
close(pipe_fd); 

./send ./recv

ouvert est correct, mais quand send.cpp exécute "write" le programme se termine et "4" n'est pas affiché !!!! Je recv side le T.a et T.b ne sont pas corrects!

Qu'est-ce qui ne va pas avec mes programmes ?! (Je dois dire que les programmes fonctionnent correctement lorsque je retire O_NONBLOCK falg)

grâce

Répondre

1

Vous devez vérifier les valeurs de retour de lecture() et write(), en particulier lorsque vous utilisez non-blocage I/O. Ils peuvent échouer parce que les données que vous voulez lire ne sont pas encore là, ils pourraient renvoyer certaines de vos données mais pas toutes parce qu'elles n'ont pas toutes été écrites, et elles pourraient échouer avec le code d'erreur EINTR ou EAGAIN. Vous voulez généralement les utiliser dans une boucle, en lisant jusqu'à ce que vous ayez toutes les données que vous voulez ou vous obtenez une erreur qui n'est pas récupérable comme EINTR/EAGAIN.