我试图通过尝试将文本文件中的数据读入第一个管道并在另一个管道上读取它来在两个进程之间进行通信,但是写功能始终失败:
主要:
int main(int argc, char* argv[])
{
int readerPip[2], writerPip[2], reader, writer;
if (pipe(readerPip))
{
fprintf (stderr, "Pipe failed.\n");
return EXIT_FAILURE;
}
if(pipe(writerPip))
{
fprintf (stderr, "Pipe failed.\n");
return EXIT_FAILURE;
}
close(readerPip[1]); // closing reader writing side pipe for main thread
reader = fork();
if (reader < 0)
{
perror("Cannot fork()");
exit(EXIT_FAILURE);
}
else if (reader == 0)
{
do_reader(readerPip);
}
wait(NULL);
close(writerPip[0]); // closing writer reader side pipe for main thread
do_father(readerPip, writerPip);
close(readerPip[0]); // closing reader reader side pipe for main thread
close(writerPip[1]); // closing writer writing side pipe for main thread
writer = fork();
if (writer < 0)
{
perror("Cannot fork()");
exit(EXIT_FAILURE);
}
else if (writer == 0)
{
do_writer(writerPip);
}
return 1;
}// main
do_Reader:
void do_reader(int readerPipe[])
{
char stringCommand[17];
long long unsigned command;
close(readerPipe[0]);
while (1)
{
scanf("%s", stringCommand);
command = convertStringToPolygon(stringCommand);
if ((command & 0xFFFFFFFF) == 0xFFFFFFFF)
{
break;
}
if (write(readerPipe[1], stringCommand, strlen(stringCommand) ) == -1)
{
printf("writing falied");
}
else
{
printf("success");
}
printf("\n");
}
close(readerPipe[1]);
exit(0);
}
做父亲
void do_father(int readerPipe[], int writerPipe[])
{
long long unsigned nbytes;
char currentPolygon[17];
currentPolygon[16] = '\0';
while (1)
{
nbytes = read(readerPipe[0], currentPolygon, sizeof(currentPolygon));
if (nbytes == 0)
{
printf("done");
break;
}
manageProgram(readerPipe, writerPipe, convertStringToCommand(currentPolygon));
}
}
写作者
void do_writer(int pip[])
{
close(pip[1]);
long long unsigned command, nbytes;
while (1)
{
nbytes = read(pip[0], &command, sizeof(command));
if (nbytes == 0)
{
break;
}
if ((((command & THIRD_BIT_MASK) != FALSE) || ((command & FORTH_BIT_MASK)
!= FALSE) ||
((command & FIFTH_BIT_MASK) != FALSE)) != FALSE)
generateOutputDependsOnBits(command);
}
close(pip[0]);
exit(0);
}
其余的代码无关紧要,因为为读取器管道进行的写入无法正常工作。 文本文件如下所示:
3a 0000050000050505 3e 003cc40000c43c3c BA 000088ec9c32ce32 f8 抄送 3a 000085ec9a32cd32 4c 8c 5c 交流电 fd FFFFFFFFFFFFFFFF
答案 0 :(得分:1)
您在readpipe[1]
中关闭main
(在fork
之前),然后在readpipe[0]
中关闭do_reader
,所以管道的两个侧面在孩子中都是封闭的。
将close(readpipe[1])
中的main
向下移动(例如,在wait
之前)。
但是,您可能不想在那里wait
。您可能想在do_father
之后执行此操作,因为这将依赖于内核管道缓冲区足够大,以容纳子对象发送给父对象的 all 数据,甚至在父对象尝试获取子对象之前,第一个字节。