【发布时间】:2013-07-25 22:52:06
【问题描述】:
我们最近在我的应用操作系统设计课程中被介绍了 fork(),但我不是很了解它。我们需要使用它在 C 文件中创建四个独立的进程,然后让其中三个进程写入一个命名管道,而第四个从它读取。
这是我目前尝试过的代码:
// creating the named pipe
mknod("/tmp/namedpipe", S_IFIFO | 0600, 0);
int myPipe;
const char* colour;
pid_t p1, p2;
p1 = fork();
if (p1 < 0)
{
printf("Fork failed\n");
}
else if (p1 == 0) // this is the child of p1, we'll call it "red"
{
printf("\nPid %d %s", getpid(), "(red) started\n");
myPipe = open("/tmp/namedpipe", O_WRONLY);
colour = "RED\n";
write(myPipe, colour, strlen(colour) +1);
close(myPipe);
}
else // the is the parent of p1, we'll call it "green"
{
printf("\nPid %d %s", getpid(), "(red) started\n");
myPipe = open("/tmp/namedpipe", O_WRONLY);
colour = "RED\n";
write(myPipe, colour, strlen(colour) +1);
close(myPipe);
p2 = fork();
if (p2 < 0)
{
printf("Fork failed\n");
}
else if (p2 == 0) // this is the child of p2, we'll call it "blue"
{
printf("\nPid %d %s", getpid(), "(blue) started\n");
myPipe = open("/tmp/namedpipe", O_WRONLY);
colour = "BLU\n";
write(myPipe, colour, strlen(colour) +1);
close(myPipe);
}
else // the is the parent of p2, we'll call it "reader"
{
printf("This is the reader process");
myPipe = open("/tmp/namedpipe", O_RDONLY);
char nextChar;
while (read(myPipe, &nextChar, 1) == 1)
printf("%c", nextChar);
close(myPipe);
}
}
如果您注释掉所有与管道相关的语句,此代码似乎可以正常工作,但否则它会执行前两个打印语句然后挂起,强制使用 CTRL-C。我不确定问题是否出在分叉上,或者是否与我在管道中写入和读取的方式有关。请告诉我。
【问题讨论】:
标签: c fork named-pipes