gpt4 book ai didi

c - Fork-exec 管道重定向问题

转载 作者:IT王子 更新时间:2023-10-29 00:36:53 26 4
gpt4 key购买 nike

谁能告诉我这段代码有什么问题吗?

总之,它创建了输入和输出管道以及 fork-exec 的 sort 程序。父级读取字典 /usr/share/dict/words 并将其写入 dup2() 的管道以排序' s 是标准的,同样,从它读取输出,打印到终端(父级的标准输出)。或者,至少,这是应该发生的事情。

回溯表明父级在第 130 行的 read() 处挂起(标有注释“XXX”)。这几乎就像 sort 不知道文件结尾一样,但是关闭 pipeIn 的写入端应该“发出信号”,对吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char** argv)
{
int pipeIn[2];
int pipeOut[2];

if ((pipe(pipeIn)) == -1)
{
perror("pipe");
exit(EXIT_FAILURE);
}

if ((pipe(pipeOut)) == -1)
{
perror("pipe");
exit(EXIT_FAILURE);
}

pid_t child = fork();

if (child == 0)
{
// This is child!

if ((dup2(pipeIn[0], STDIN_FILENO)) == -1)
{
perror("dup2");
exit(EXIT_FAILURE);
}

if ((dup2(pipeOut[1], STDOUT_FILENO)) == -1)
{
perror("dup2");
exit(EXIT_FAILURE);
}

if ((dup2(pipeOut[1], STDERR_FILENO)) == -1)
{
perror("dup2");
exit(EXIT_FAILURE);
}

if ((close(pipeIn[0])) == -1)
{
perror("close");
exit(EXIT_FAILURE);
}

if ((close(pipeOut[1])) == -1)
{
perror("close");
exit(EXIT_FAILURE);
}

if ((execlp("sort", "-r", NULL)) == -1)
{
perror("execlp");
exit(EXIT_FAILURE);
}
}
else if (child == -1)
{
perror("fork");
exit(EXIT_FAILURE);
}
else
{
// This is parent!

if ((close(pipeIn[0])) == -1)
{
perror("close");
exit(EXIT_FAILURE);
}

if ((close(pipeOut[1])) == -1)
{
perror("close");
exit(EXIT_FAILURE);
}

int dict = open("/usr/share/dict/words", O_RDONLY);

if (dict == -1)
{
perror("open");
exit(EXIT_FAILURE);
}

char buf[1024];
int count;

while ((count = read(dict, buf, sizeof(char) * 1024)) > 0)
{
putchar('.');

if ((write(pipeIn[1], buf, count)) == -1)
{
perror("write 1");
exit(EXIT_FAILURE);
}
}

if (count == -1)
{
perror("read");
exit(EXIT_FAILURE);
}

if ((close(dict)) == -1)
{
perror("close");
exit(EXIT_FAILURE);
}

if ((close(pipeIn[1])) == -1)
{
perror("close");
exit(EXIT_FAILURE);
}

while ((count = read(pipeOut[0], buf, sizeof(char) * 1024)) > 0) // XXX
{
putchar('!');

if ((write(STDOUT_FILENO, buf, count)) == -1)
{
perror("write 2");
exit(EXIT_FAILURE);
}
}

if (count == -1)
{
perror("read");
exit(EXIT_FAILURE);
}

if ((close(pipeOut[0])) == -1)
{
perror("close");
exit(EXIT_FAILURE);
}
}

return EXIT_SUCCESS;
}

感谢您的任何意见(请原谅双关语)。

最佳答案

你的问题是你没有在智利过程中关闭管道未使用的末端。所以需要在exec

之前的某处添加如下代码
    if ((close(pipeIn[1])) == -1)
{
perror("close");
exit(EXIT_FAILURE);
}

if ((close(pipeOut[0])) == -1)
{
perror("close");
exit(EXIT_FAILURE);
}

关于c - Fork-exec 管道重定向问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8555900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com