C - 子进程不执行
C - Child Process Not Executing
[已解决]
因此,对于我分配的这个练习,我们正在练习过程控制。我只是想知道为什么我的子进程似乎永远不会执行(当 child_pid == 0 时)。对此问题的任何帮助将不胜感激!
还有,safe_fork()是我们导师为了避免学生打开太多进程而写的一个函数。
#include "safe-fork.h"
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
int main(void) {
pid_t child_pid;
int pipefd[2];
int pipe_result;
int count;
pipe_result = pipe(pipefd);
if (pipe_result == -1) {
perror("pipe failure");
exit(1);
}
child_pid = safe_fork();
/*Parent Process*/
if (child_pid > 0) {
dup2(pipefd[0], STDIN_FILENO);
scanf("%d", &count);
if (count > 200) {
printf("Long enough!\n");
exit(0);
}
else {
printf("Too short!\n");
exit(1);
}
}
/* Child Process */
else {
dup2(pipefd[1], STDOUT_FILENO);
execl("/usr/bin/wc", "-w");
}
return 0;
}
这里有一个建议,检查 child_pid == 0 明确导致它也可能是你的 safe_fork() 函数失败的情况,同时检查这些错误,即 child_pid < 0。
如果您还没有添加调试 printf 语句来检查控制流,最后检查 execl 调用是否失败。
另请查看此 tutorial,了解如何在 C 中创建管道并使用它们在父进程和子进程之间进行通信。我觉得您处理这些文件描述符的方式存在一些问题。您看不到任何输出的一个可能原因是 wc 可能仍在等待一些输入。
还有一件事,您可能需要等待子进程 complete/do 有用的东西或实际上 运行 在检查其输出之前。在你担心这个之前先检查其他问题。
希望对您有所帮助:)
是的,但不是。首先你要仔细理解fork()的含义。
fork(): 创建一个 child 进程,它 return 进入 两个进程,每个进程具有不同的 return 值。 在 parent 中,它总是 return 是 OS 为新创建的 child 进程 ID 分配的编号。同时它在新创建的 child 中也有 return,因为 child 进程将在 fork() 语句之后开始执行从 parent 复制的代码。在 child fork 中总是 return 为零。所以通常在 fork() 系统调用之后,人们通过 fork 检查 returned 值以区分 child 进程和 parent 进程。
特别是在这种情况下,在 fork() 之后,将有两个具有相同代码和相同程序状态的进程(除了在 child_pid 变量中分配不同的值)。在 parent 中,它是一个非零值(对应于 child 的 pid),在 child 中,它的值为零,因为分叉 return 在 [= 中为零31=]。
现在两个进程都将执行
if (child_pid > 0)
仅对 parent 为真,因此 parent 进程将流入 'if block',对 child 为假,因此它将直接跳转到 else 部分并执行else 块。
如果 child_process id 为零怎么办?
OS 将始终为 child 分配一个非零值,以便 fork() 工作。如果您以某种方式将 child 进程 ID 设为零,那么 parent 将无法进入 'if block' 并将执行与 child.[=11 相同的其他块=]
[已解决] 因此,对于我分配的这个练习,我们正在练习过程控制。我只是想知道为什么我的子进程似乎永远不会执行(当 child_pid == 0 时)。对此问题的任何帮助将不胜感激! 还有,safe_fork()是我们导师为了避免学生打开太多进程而写的一个函数。
#include "safe-fork.h"
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
int main(void) {
pid_t child_pid;
int pipefd[2];
int pipe_result;
int count;
pipe_result = pipe(pipefd);
if (pipe_result == -1) {
perror("pipe failure");
exit(1);
}
child_pid = safe_fork();
/*Parent Process*/
if (child_pid > 0) {
dup2(pipefd[0], STDIN_FILENO);
scanf("%d", &count);
if (count > 200) {
printf("Long enough!\n");
exit(0);
}
else {
printf("Too short!\n");
exit(1);
}
}
/* Child Process */
else {
dup2(pipefd[1], STDOUT_FILENO);
execl("/usr/bin/wc", "-w");
}
return 0;
}
这里有一个建议,检查 child_pid == 0 明确导致它也可能是你的 safe_fork() 函数失败的情况,同时检查这些错误,即 child_pid < 0。 如果您还没有添加调试 printf 语句来检查控制流,最后检查 execl 调用是否失败。
另请查看此 tutorial,了解如何在 C 中创建管道并使用它们在父进程和子进程之间进行通信。我觉得您处理这些文件描述符的方式存在一些问题。您看不到任何输出的一个可能原因是 wc 可能仍在等待一些输入。
还有一件事,您可能需要等待子进程 complete/do 有用的东西或实际上 运行 在检查其输出之前。在你担心这个之前先检查其他问题。
希望对您有所帮助:)
是的,但不是。首先你要仔细理解fork()的含义。
fork(): 创建一个 child 进程,它 return 进入 两个进程,每个进程具有不同的 return 值。 在 parent 中,它总是 return 是 OS 为新创建的 child 进程 ID 分配的编号。同时它在新创建的 child 中也有 return,因为 child 进程将在 fork() 语句之后开始执行从 parent 复制的代码。在 child fork 中总是 return 为零。所以通常在 fork() 系统调用之后,人们通过 fork 检查 returned 值以区分 child 进程和 parent 进程。
特别是在这种情况下,在 fork() 之后,将有两个具有相同代码和相同程序状态的进程(除了在 child_pid 变量中分配不同的值)。在 parent 中,它是一个非零值(对应于 child 的 pid),在 child 中,它的值为零,因为分叉 return 在 [= 中为零31=]。 现在两个进程都将执行
if (child_pid > 0)
仅对 parent 为真,因此 parent 进程将流入 'if block',对 child 为假,因此它将直接跳转到 else 部分并执行else 块。
如果 child_process id 为零怎么办?
OS 将始终为 child 分配一个非零值,以便 fork() 工作。如果您以某种方式将 child 进程 ID 设为零,那么 parent 将无法进入 'if block' 并将执行与 child.[=11 相同的其他块=]