流程如何使用C管道顺序工作?

时间:2015-11-18 00:00:59

标签: c pipe fork

我想这样做,2个子进程会把他们的名字等到其他进程放到他的名字。例如,如果有第一个和第二个过程,首先会输入她的名字,并在屏幕上等待其他人的名字。所以我想处理流程,我想看看它们是按顺序工作的。

输出:

first
second
first
second
first
second

我刚试过一些关于C(linux)的东西。

int main(void) 
{    
    pid_t child_a, child_b;
    int pipe1[2], pipe2[2];
    char mesazhi1[] = "first";
    char mesazhi2[] = "second";

    char buf[1024];

    int first_pipe = pipe(pipe1);
    pipe(pipe2);

    if(first_pipe == -1){
        perror("pipe");
        exit(1);
    }

    child_a = fork();

    if (child_a == 0) 
    {
        /* Child A code */
        int i;
        for (i = 0; i < 3; i++)
        {
            write(pipe1[1],mesazhi1, strlen(mesazhi1) + 1);
            //printf("first\n");
            int a = read(pipe2[0], buf, strlen(mesazhi2) + 1); 
            printf("%s - %d\n", buf, a);
        }
    } 
    else 
    {
        child_b = fork();

        if (child_b == 0) 
        {
            int i;
            for (i = 0; i < 3; i++)
            {   
                write(pipe2[1],mesazhi2, strlen(mesazhi2) + 1);
                //printf("second\n");
                int a = read(pipe1[0], buf, strlen(mesazhi1) + 1); 
                printf("%s - %d\n", buf, a);
            }
        } 
        else 
        {
            /* Parent Code */

            int returnStatusA,returnStatusB;    
            waitpid(child_a, &returnStatusA, 0);  // Parent process waits here for child to terminate.
            waitpid(child_b, &returnStatusB, 0);  // Parent process waits here for child to terminate.


            if (returnStatusA == 0 && returnStatusB == 0)  // Verify child process terminated without error.  
            {
               printf("%s\n", "The child processes terminated normally.\n"); 
            }

            if (returnStatusA == 1 && returnStatusB == 1)      
            {
               printf("%s\n", "The child processes terminated with an error!. \n" );    
            }
        }
    }
}

随机放置名称。我的意思是,我认为,有时第二个过程比第一个过程更快。输出如下:

first
second
second
first
second
...

那么为什么第二个进程不等待第一个进程,因为我认为read()函数应该等到pipe1中有东西。

1 个答案:

答案 0 :(得分:1)

在发布的代码中,两个进程都写入各自的管道,然后读取。在那之后,看到哪个进程首先打印是一场竞赛。

对于更受控制的情况,请在呼叫read之前让儿童B呼叫printfwrite 。这样B在打印前必须等待A,反之亦然。

if (child_b == 0) 
{
    int i;
    for (i = 0; i < 3; i++)
    {   
        int a = read(pipe1[0], buf, strlen(mesazhi1) + 1); 
        printf("%s - %d\n", buf, a);
        write(pipe2[1],mesazhi2, strlen(mesazhi2) + 1);
    }
}