我有这段代码:
close(pipefd[0]);
fp = fopen(argv[1], "r");
if(fp)
{
while((c = getc(fp)) != EOF)
{
if((write(pipefd[1], c, 1)) < 1)
{
fprintf(stderr, "Write to pipe failed.\n");
exit(EXIT_FAILURE);
}
}
}
fclose(fp);
close(pipefd[1]);
waitpid(childPID, &status, 0);
exit(EXIT_SUCCESS);
根据我的理解,应该打开一个文件并将其内容写入管道。然后这成为另一个程序的标准输入。我的测试显示除了写入之外一切正常,但我不知道它为什么不起作用。
我只是做些蠢事吗?
编辑: 是的,我做了一些蠢事。
我认为问题出在我的写作上(在我修复c之后需要&amp; c),但它实际上是在我的子进程中,我使用dup2()将管道的读取端链接到我的孩子过程的标准。我有倒退的论点。这是从fork()开始的工作代码:
childPID = fork();
if (childPID == 0)
{
//child code
//printf("In the child process.\n");
dup2(pipefd[0], STDIN_FILENO);
close(pipefd[1]);
execv(argv[2], paramList);
printf("You shouldn't be seeing this.\n");
}
else
{
//parent code
//printf("In the parent process\n");
close(pipefd[0]);
fp = fopen(argv[1], "r");
if(fp)
{
while((c = getc(fp)) != EOF)
{
if((write(pipefd[1], &c, 1)) < 1)
{
fprintf(stderr, "Write to pipe failed.\n");
perror("write");
exit(EXIT_FAILURE);
}
}
}
fclose(fp);
close(pipefd[1]);
waitpid(childPID, &status, 0);
exit(EXIT_SUCCESS);
}
希望这有助于其他人不必在桌子上敲头四天!感谢那些有时间回答的人。
答案 0 :(得分:2)
write()
获取指向要写入的数据缓冲区的指针,而不是字符(实际上是数字)。
答案很简单,不是将c
传递给write()
,而是传递c
的地址,即。 &c
。