进程通信:发送*命令,为什么循环

时间:2014-10-20 19:30:49

标签: c pipe fork dup2

我试图启动一个子进程并向他发送管道命令。我想我想念一个我不了解的概念。

第一个命令发送成功,另一个失败,它给了我一个无限循环。我不明白为什么。

parent.c

int invoke_proc(int out_tube[2]) {

    pid_t pid; 
    int rv; 
    int tube[2];

    if(pipe (tube)) {
        fprintf(stderr, "pipe");
        exit(1);
    }

    pid = fork();
    if (pid == -1) {
        fprintf(stderr, "fork");
        exit(1);
    }

    // parent
    if(pid) {
        close(tube[0]);
        out_tube[1] = tube[1];
    }

    // child
    else {
        close(tube[1]);
        dup2(tube[0], 0);
        execl("child", "child", NULL);
    }

    return 0;
}

int main() {
    int tube[2];
    //for (int i = 0; i < 2; i++) {
        invoke_proc(tube);

        sleep(2);
        write(tube[1], "allo\n", 7);
        printf("!\n");

        sleep(5);
        write(tube[1], "bye bye\n", 10);
        printf("!\n");

        sleep(5);
        write(tube[1], "exit\n", 10);
        printf("!\n");

        close(tube[1]);

    //}
    return 0;
}

child.c

int main() {
    char string[100];

    printf("Child Process: [%d]\n", getpid()); 
    printf("-------------\n"); 

    do{ 
        printf("Enter Command: "); 

        fflush(stdout); 

        fgets(string, 100, stdin); 
        printf("[%s]\n",string);    

    } while(strcmp(string, "exit"));
    return 0;   
}

这是输出:

  

-bash-4.1 $ ./parent      儿童过程:[61983]

     
     

输入命令:[allo

     

     

<!/ P>      

输入命令:!

     

[]

     

输入命令:^ C

     

-bash-4.1 $

我结束了这个过程,否则它会在此后给我一个无限循环。

我正在阅读类似的问题,但我无法找到答案。如果可能的话,请尽可能简单地回答。

感谢名单。

是的,是的。这是一项学校工作。我的目标是将相同的命令发送给多个孩子。但我首先试图摆脱这一步。

1 个答案:

答案 0 :(得分:0)

Nvm,我从另一个来源找到了解决方案:http://www.makelinux.net/alp/038

我正在将文件描述符转换为File *,并将其写入。

不确定,但它能满足我的需求。

的Tx。

相关问题