- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我知道这是一个简单的练习,但我遇到了麻烦。我正在尝试模仿:
grep arg1 arg2 | wc -l
我收到以下错误:“wc:标准输入:执行时文件描述符错误”。这是我的代码:
int main(int argc, char *argv[])
{
if (argc != 3) usage();
int pd[2]; //Pipe descriptor
pipe(pd);
int pid = fork();
if (pid < 0) perror("Something failed on trying to create a child process!\n");
else if (pid == 0) { //Child
dup2(pd[1], 0);
close(pd[0]);
close(pd[1]);
execlp("wc", "wc", "-l", (char *)NULL);
} else { //Parent
dup2(pd[0], 1);
close(pd[0]);
close(pd[1]);
execlp("grep", "grep", argv[1], argv[2], (char *)NULL);
}
}
可能是什么问题?
最佳答案
你有:
else if (pid == 0) { //Child
dup2(pd[1], 0);
close(pd[0]);
close(pd[1]);
execlp("wc", "wc", "-l", (char *)NULL);
}
你需要:
else if (pid == 0) { //Child
dup2(pd[0], 0);
close(pd[0]);
close(pd[1]);
execlp("wc", "wc", "-l", (char *)NULL);
fprintf(stderr, "Failed to execute 'wc'\n");
exit(1);
}
关键的变化是dup2()
;您的代码将管道的写入端复制到 child 的标准输入,这不是幸福的秘诀。修改后的代码将管道的读取端复制到 child 的标准输入。很容易记住哪个是哪个:stdin 是文件描述符 0 和管道描述符 0 是输入描述符(管道的读取端),而 stdout 是文件描述符 1 和管道描述符 1 是输出描述符(写管道的末端)。
您需要在“父”代码中进行相反的更改。
当 wc
试图从一个只为写入而打开的文件描述符中读取时,会出现错误。
请注意,如果 execlp()
— 或 exec*()
函数系列的任何其他成员 — 返回,则失败。处理该错误很重要,通常通过在标准错误上报告问题并退出。 exec*()
操作后没有语句很少是正确的。
关于c - 厕所 : standard input: Bad file descriptor on fork + pipe + execlp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37603297/
我已经在 Stackoverflow 上阅读了有关此主题的帖子,但无法理解要点。也许我们可以将它们的差异限制在一个具体的例子中。 有一个带锁的厕所。Mutex:一个线程拿走 key 进去。如果有任何其
抱歉,如果我的问题不清楚,我的词汇量在 c 和指针等方面不是很好。 我有一个简单的程序,它采用包含以下结构的 header data.h。 #ifndef MENU_H_ #define MENU_H
当我在终端中运行此命令时,它会显示一个数字。当我使用 cd 命令挂载另一个文件夹时,数字会发生变化。 最佳答案 ls -la // List files in your current directo
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 5 年前。 此问题似乎与 a specific programming problem, a sof
我知道这是一个简单的练习,但我遇到了麻烦。我正在尝试模仿: grep arg1 arg2 | wc -l 我收到以下错误:“wc:标准输入:执行时文件描述符错误”。这是我的代码: int main(i
我是一名优秀的程序员,十分优秀!