2013-05-05 101 views
0

我想叉两个孩子。父母读取发送到管道的行。孩子读它并将其写入另一个管道,最后child2读取它。但是,输出始终是父项。谢谢!C叉两个孩子和父母与子女之间的管道

#define MAX 80 

void child(); 
void parent(); 
void childtwo(); 
char * getli(); 
void printline(char *buffer, int count); 
char * convertCase(char *str); 

int pipe1[2]; 
int pipe2[2]; 
int main(int argc, char **argv) 
{ 
    pipe(pipe1); 
    pipe(pipe2); 
    if(fork()){ 
    if(fork()){ 
     printf("1st\n"); 
     parent(); 
      exit(0); 
    } 
    else{ 
     printf("3rd\n"); 
     childtwo(); 
     exit(0); 
    } 
    } 
    else{ 
    printf("2nd\n"); 
    child(); 
    exit(0); 
    } 
} 

void child(){ 
    char *buf; 
    int count = 0; 
    close(pipe1[1]); 
    close(pipe2[0]); 
    while(1){ 
    buf = (char *) malloc(sizeof(char)*MAX); 
    read(pipe1[0], buf, MAX); 
    if (strcmp(buf,"quit")== 0){ 
    printf("Child is leaving\n"); 
    free(buf); 
    break; 
    } 
    else{ 
    printf("Child: "); 
    printline(buf,strlen(buf)); 
    write(pipe2[1],buf, strlen(buf)+1); 
    free(buf); 
     } 
    close(pipe2[1]); 
    close(pipe1[0]); 
    exit(0); 
    } 
} 

void childtwo() 
{ 
    char *buf; 
    int count = 0; 
    close(pipe2[1]); 
    buf = (char *) malloc(sizeof(char)*MAX); 
    while(1){ 
    buf = (char *) malloc(sizeof(char)*MAX); 
    read(pipe2[0], buf, MAX); 
    if (strcmp(buf,"quit")== 0){ 
     printf("Childtwo is leaving\n"); 
     free(buf); 
     break; 
    } 
    else{ 
     printf("Childtwo:"); 
     printline(buf,strlen(buf)); 
     free(buf); 
    } 
    } 
    close(pipe2[0]); 
    exit(0); 
} 

void parent(){ 
    char * buffer; 
    int count = 0, done=0; 
    close(pipe1[0]); 
    while (done != 1){ 
    printf("parent getting line: "); 
    buffer = getli(); 
    write(pipe1[1],buffer, strlen(buffer)+1); 
    if (strcmp(buffer,"quit")== 0){ 
     puts("parent goes away"); 
     free(buffer); 
     break; 
    } 
    free(buffer); 
    } 
    close(pipe1[1]); 
    exit(0); 
} 
+0

你的子进程有内存泄漏,你在循环之前和循环内部分配'buf' _both_。 – 2013-05-05 00:48:45

+0

谢谢指出!但删除它并没有解决问题 – otchkcom 2013-05-05 00:52:38

+0

你是否检查过所有系统调用实际上是_work_?您应该检查他们返回的内容,例如, 'read'返回'-1',那么出现了一些错误,你可以使用例如['perror'](http://en.cppreference.com/w/c/io/perror)打印出错误。您应该为_all_函数执行此操作,即使'fork'可能会失败。 – 2013-05-05 01:07:43

回答

0

我的猜测是,它适用于第一行,但不适用于任何其他。

这是因为第一个子进程(在child函数中)在读取其输入后退出。您可能打算将closeexit调用放在循环之外。

+0

不幸的是,它甚至不是第一次工作。我关闭并退出循环外,但得到了相同的结果 – otchkcom 2013-05-05 00:56:27