我想打一个简单的程序,即叉,和孩子写入命名管道和家长从命名管道读取并显示。 问题是,它进入母体,确实第一个printf,然后会很奇怪,它不会做任何事情,没有得到第二个printf,它只是在控制台输入方式。
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void main()
{
char t[100];
mkfifo("myfifo",777);
pid_t pid;
pid = fork();
if (pid==0)
{
//execl("fifo2","fifo2",(char*)0);
char r[100];
printf("scrie2->");
scanf("%s",r);
int fp;
fp = open("myfifo",O_WRONLY);
write(fp,r,99);
close(fp);
printf("exit kid \n");
exit(0);
} else
{
wait(0);
printf("entered parent \n"); // <- this it prints
// whats below this line apparently its not being executed
int fz; printf("1");
fz = open("myfifo",O_RDONLY); printf("2");
printf("fd: %d",fz);
char p[100];
int size;
printf("------");
//struct stat *info;
//stat("myfifo",info); printf("%d",(*info).st_size);
read(fz,p,99);
close(fz);
printf("%s",p);
printf("exit"); exit(0);
}
}
你真的应该检查对函数的返回值的误差要求,特别是mkfifo()
和open()
您的来电wait()
将会导致其当前位置的问题。 打开一个FIFO为直到其他进程打开用于写入的同一FIFO,反之亦然1读取正常块。 家长正在等待孩子终止,孩子正在等待读取器进程,即父,连接到FIFO。
1 -参见附注上open()
下面是一个用O_NONBLOCK
与FIFO
移动wait()
调用父进程与呼叫模式更改为退出一起之前mkfifo()
到0666
,似乎解决您的一些眼前的问题。
这也是很好的做法,当你用它完成去除FIFO。
unlink("myfifo");
从open()
IEEE标准1003.1-2004函数文档 :
当用户打开带有O_RDONLY一个FIFO或O_WRONLY设置:
下面的例子是组合在你原来的问题代码和的Beej指南的Unix IPC FIFO页 :
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#define FIFO_NAME "myfifo"
int main(void)
{
char buf[256];
int num, fd;
pid_t pid;
if (mkfifo(FIFO_NAME, 0666) < 0)
perror("mkfifo");
pid = fork();
if (pid == 0)
{
printf("child - waiting for readers...\n");
if ((fd = open(FIFO_NAME, O_WRONLY)) < 0)
perror("child - open");
printf("child - got a reader -- type some stuff\n");
while (fgets(buf, sizeof(buf), stdin), !feof(stdin))
{
if ((num = write(fd, buf, strlen(buf))) < 0)
perror("child - write");
else
printf("child - wrote %d bytes\n", num);
}
close(fd);
exit(0);
}
else
{
printf("parent - waiting for writers...\n");
if ((fd = open(FIFO_NAME, O_RDONLY)) < 0)
perror("parent - open");
printf("parent - got a writer\n");
do
{
if ((num = read(fd, buf, sizeof(buf))) < 0)
perror("parent - read");
else
{
buf[num] = '\0';
printf("parent - read %d bytes: \"%s\"\n", num, buf);
}
} while (num > 0);
close(fd);
wait(0);
}
unlink(FIFO_NAME);
return 0;
}
这个例子在Linux中进行了测试。 按Ctrl - d终止程序。
首先,尝试改为fprintf中到stderr的printf(到stdout)
标准错误是无缓冲。
那么你可以告诉什么是真正获取打印,哪些没有。
或者至少加fflush
等待任何东西之前。
文章来源: C Named pipe (fifo). Parent process gets stuck