首页 > 解决方案 > 在c中通过命名管道传递值

问题描述

我有这段代码可以从父亲那里创建 3 个子进程。对于每个孩子,我有一个数组pid[i],其中每个孩子都有 -1 值,i != i (number)因此我可以使用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

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

标签: coperating-system

解决方案


推荐阅读