[unix] tubes nommés, ça bloque...

tubes nommés, ça bloque... [unix] - C - Programmation

Marsh Posté le 03-12-2004 à 20:40:41    

Salut,
je comprends pas ce code compile mais bloque à l'éxécution, comme si un seul des 2 open était réalisé, l'autre bloquant...
 

Code :
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <sys/stat.h>
  6. using namespace std;
  7. int main()
  8. {
  9.   char buf[10];
  10.   int pid, fd;
  11.   unlink("toto" );
  12.   umask(0);
  13.   mkfifo("toto", 0777);
  14.   pid = fork();
  15.   switch(pid)
  16.   {
  17.   case -1: cout << "error" << endl; exit(1);
  18.   case 0: //fils
  19.     fd = open("toto", O_RDONLY);
  20.     if(fd < 0)
  21.     {
  22.       cout << "erreur open fils" << endl;
  23.       exit(2);
  24.     }
  25.     read(fd, buf, 5);
  26.     cout << buf << endl;
  27.     exit(0);
  28.   default:
  29.     fd = open("toto", O_WRONLY);
  30.     if(fd<0)
  31.     {
  32.       cout << "erreur open pere" << endl;
  33.       exit(2);
  34.     }
  35.     write(fd, "bonjour\n", 8);
  36.   }
  37. }


merci

Reply

Marsh Posté le 03-12-2004 à 20:40:41   

Reply

Marsh Posté le 03-12-2004 à 21:53:28    

Code :
  1. #include <stdlib.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. #include <sys/stat.h>
  5. #include <stdio.h>
  6. #include <sys/types.h>
  7. #include <sys/wait.h>
  8. #define NAMED_PIPE_NAME "/tmp/hfr.fifo"
  9. static int child()
  10. {
  11. int fd;
  12. ssize_t n;
  13. char buffer[80];
  14. fd = open(NAMED_PIPE_NAME, O_RDONLY);
  15. if(fd < 0)
  16. {
  17.  perror("[child] open" );
  18.  return 2;
  19. }
  20. while((n = read(fd, buffer, sizeof buffer - 1)) > 0)
  21. {
  22.  buffer[sizeof buffer - 1] = '\0';
  23.  printf("[child] got \"%s\"\n", buffer);
  24. }
  25. if(n == -1)
  26. {
  27.  perror("[child] read" );
  28.  return 4;
  29. }
  30. close(fd);
  31. return 0;
  32. }
  33. static int parent()
  34. {
  35. int fd;
  36. ssize_t n;
  37. char buffer[] = "Hello world !";
  38. fd = open(NAMED_PIPE_NAME, O_WRONLY);
  39. if(fd < 0)
  40. {
  41.  perror("[parent] open" );
  42.  return 2;
  43. }
  44. n = write(fd, buffer, sizeof buffer);
  45. if(n == -1)
  46. {
  47.  perror("[parent] write" );
  48.  return 4;
  49. }
  50. printf("[parent] sent \"%s\"\n", buffer);
  51. close(fd);
  52. wait(NULL);
  53. return 0;
  54. }
  55. int main()
  56. {
  57. unlink(NAMED_PIPE_NAME);
  58. umask(0);
  59. mkfifo(NAMED_PIPE_NAME, 0777);
  60. switch(fork())
  61. {
  62. case -1:
  63.  perror("fork" );
  64.  return 1;
  65. case 0:
  66.  return child();
  67. default:
  68.  return parent();
  69. }
  70. }


Message édité par Taz le 03-12-2004 à 21:54:13
Reply

Marsh Posté le 03-12-2004 à 23:00:37    

merci!
malheureusement, ça bloque toujours et quand je kill le programme, je vois :
[parent] write: Bad file descriptor
 
je précise je suis sous cygwin, en ssh sous linux il semblerait que ça marche...

Reply

Marsh Posté le 04-12-2004 à 03:12:47    

ben les pipe sous windows, je sais pas

Reply

Marsh Posté le 04-12-2004 à 10:16:14    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed