2015-05-20 2 views
0

Я закодировал этот (надеюсь, правильный) анонимный канал в C с Ubuntu, но я не могу подключиться в обоих направлениях. Как я могу исправить это самым простым способом, подключиться от дочернего к родительскому и от родителя к ребенку?двунаправленная анонимная труба в c

int main() { 
int ret_val; 
int pfd[2]; 
char buff[32]; 
char string1[]="String for pipe I/O"; 

ret_val = pipe(pfd); 

if (fork() == 0) { 
    // child 
    close(pfd[0]); // close the read end 
    ret_val = write(pfd[1],string1,strlen(string1)); /*Write to pipe*/ 
    if (ret_val != strlen(string1)) { 
     printf("Write did not return expected value\n"); 
     exit(2); // Print error message and exit 
    } 
} 
else { 
    // parent 
    close(pfd[1]); /* close the write end of pipe */ 
    ret_val = read(pfd[0],buff,strlen(string1)); /* Read from pipe */ 
    if (ret_val != strlen(string1)) { 
     printf("Read did not return expected value\n"); 
     exit(3);      /* Print error message and exit */ 
    } 
    printf("parent read %s from the child program\n",buff); 

} 
exit(0); 
} 
+2

Лучшая вещь - сделать вторую трубу на этот раз с перевернутыми концами по сравнению с первым. – Abel

ответ

0

Смотрите ниже, и он работает только так, потому что труба 4KB буфер и строки меньше, в противном случае он может попасть в тупик.

#include <string.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 

int main() { 
    int ret_val; 
    int pfd[2]; 
    int dfp[2]; 
    char buff[32]; 
    char string1[]="String for pipe I/O"; 
    char string2[]="String 2 for pipe I/O"; 

    ret_val = pipe(pfd), pipe(dfp); 

    pid_t pid = fork(); 
    if (0 > pid) { 
     printf("Error forking\n"); 
     exit(1); 
    } 
    if (pid == 0) { 
     // child 
     close(pfd[0]); // close the read end 
     close(dfp[1]); // close the write end 
     ret_val = write(pfd[1],string1,strlen(string1)); /*Write to pipe*/ 
     if (ret_val != strlen(string1)) { 
      printf("Write did not return expected value\n"); 
      exit(2); // Print error message and exit 
     } 
     ret_val = read(dfp[0],buff,strlen(string2)); /* Read from pipe */ 
     if (ret_val != strlen(string2)) { 
      printf("Read did not return expected value\n"); 
      exit(3);      /* Print error message and exit */ 
     } 
     printf("child read '%s' from the parent program\n",buff); 
    } 
    else { 
     // parent 
     close(pfd[1]); /* close the write end of pipe */ 
     close(dfp[0]); /* close the read end */ 
     ret_val = write(dfp[1],string2,strlen(string2)); /*Write to pipe*/ 
     if (ret_val != strlen(string2)) { 
      printf("Write did not return expected value\n"); 
      exit(2); // Print error message and exit 
     } 
     ret_val = read(pfd[0],buff,strlen(string1)); /* Read from pipe */ 
     if (ret_val != strlen(string1)) { 
      printf("Read did not return expected value\n"); 
      exit(3);      /* Print error message and exit */ 
     } 
     printf("parent read '%s' from the child program\n",buff); 
     wait(NULL); 
    } 
    exit(0); 
} 
+0

Спасибо, кажутся законными –

Смежные вопросы