我有这段代码可以从父亲那里创建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
但是,每次运行都会得到不同的结果(它可能会产生正确的结果)。为什么会发生这种情况,我该如何控制呢?