通过c中的命名管道传递值

时间:2019-05-01 15:35:33

标签: c operating-system

我有这段代码可以从父亲那里创建3个子进程。对于每个孩子,我都有一个数组pid[i],该数组对孩子的每个i != i (number)都有-1值,因此我可以使用if(pid[i]==0)隔离每个孩子代码。第一个孩子将值1传递给第二个孩子。第二个孩子计算1*2并将其传递给第三个孩子,第三个孩子计算(1*2)*3

代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>

int mkfifo(const char *path, mode_t mode);

int main(int argc, char **argv)
{
    int fd,rec,recs;
    char * myfifo = "/tmp/myfifo";
    mkfifo(myfifo, 0666);
    pid_t pid[4];
    pid[1]=fork();
    if(pid[1]==0){
        pid[2]=-1;
        pid[3]=-1;
             }
    if(pid[1]>0){
       pid[2]=fork();
       if(pid[2]==0){
          pid[1]=-1;
          pid[3]=-1;
       }
         if(pid[2]>0){
           pid[3]=fork();
           if(pid[3]==0){
              pid[1]=-1;
              pid[2]=-1;
           }
             }
    wait(0);
    }

    if(pid[1]==0){
      rec=1;
      fd = open(myfifo, O_WRONLY);
      write(fd, &rec, sizeof(rec));
      close(fd);
    }
    if(pid[2]==0){
        fd = open(myfifo, O_RDONLY);
        read(fd, &recs, sizeof(recs));
        rec=recs*2;
        printf(" passed value is %d \n",rec);
        fd = open(myfifo, O_WRONLY);
        write(fd, &rec, sizeof(rec));
        close(fd);
    }
    if(pid[3]==0){
        fd = open(myfifo, O_RDONLY);
        read(fd, &recs, sizeof(recs));
        rec=recs*3;
        printf(" passed value is %d \n",rec);
        fd = open(myfifo, O_WRONLY);
        write(fd, &rec, sizeof(rec));
        close(fd);
    }
}

我希望该程序能够打印:

passed value is 2
passed value is 6

但是,每次运行都会得到不同的结果(它可能会产生正确的结果)。为什么会发生这种情况,我该如何控制呢?

0 个答案:

没有答案