c - 在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
但是,每次运行它都会得到不同的结果(它可能会产生正确的结果)。为什么会发生这种情况,我该如何控制?
解决方案
推荐阅读
- javascript - 尝试删除/更新文档时出现“mongoError:拓扑被破坏”
- postgresql - Datastage中的Postgres存储过程
- linux - Postgresql:连接被拒绝服务器是否在主机“127.0.01”(127.0.0.1)上运行并接受端口 5432 上的 TCP/IP 连接?
- python - 在 Kivy 中执行 ModalView 子类会混淆视图和子项的位置
- html - Angular 8 输入类型日期删除错误的日期值
- php - TYPO3 v10 - 在 eID_include 中使用上下文 API 获取 feUser 对象
- java - 多个身份验证提供程序 Android Firebase
- python - 使用 pip 或诗歌时 errno 9 错误的文件描述符
- ios - 重复通知在 watchOS 模拟器中不重复
- ios - AppStore Connect 是否应该打开 Unrestricted Web Access?