我试图通过尝试将文本文件中的数据读入第一个管道并在另一个管道上读取数据来在两个进程之间进行通信,但写入功能总是失败:
主要:
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);
}
do_father
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));
}
}
do_writer
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 cc 3a 000085ec9a32cd32 4c 8c 5c ac fd FFFFFFFFFFFFFFFF
最佳答案
您在main
中关闭readpipe[1]
(在fork
之前)并关闭readpipe [0]
在 do_reader
中,因此管道的两侧在子级中都是关闭的。
将 main
中的 close(readpipe[1])
移至更下方(例如,在 wait
之前)。
但是,您可能不想在那里等待
。您可能希望在 do_father
之后执行此操作,因为这将依赖于内核管道缓冲区是否足够大,以在父级尝试之前容纳子级发送到父级的所有数据。获取第一个字节。
关于c - 写入管道总是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53677401/