C - 子进程未执行

时间:2016-11-11 05:44:23

标签: c multithreading unix multitasking

[解决] 因此,对于本次练习,我被分配了我们正在练习过程控制。我只是想知道为什么我的子进程似乎永远不会执行(当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;
}

2 个答案:

答案 0 :(得分:3)

这是一个建议,明确地检查child_pid == 0是否也可能是你的safe_fork()函数失败的情况,也检查那些错误,即child_pid&lt; 0。 添加调试printf语句以检查控制流程(如果您还没有)并最终检查execl调用是否失败。

另外,请查看此tutorial以在C中创建管道并使用它们在父进程和子进程之间进行通信。我觉得你处理这些文件描述符的方式存在一些问题。您无法看到任何输出的可能原因是wc可能仍在等待某些输入。

另外一件事你可能需要等待子进程完成/做一些有用的事情或者在检查输出之前实际运行。在您担心之前先检查其他问题。

希望这有助于:)

答案 1 :(得分:0)

是的,但不是。首先,你应该仔细了解fork()的含义 fork():创建一个子进程并返回两个进程,每个进程中返回值不同。在父进程中,它总是返回操作系统为其分配的数字。新创建的子进程ID。同时它也会在新创建的子节点中返回,因为子进程将在fork()语句之后开始执行从父节点复制的代码。在子fork中总是返回零。因此,通常在fork()系统调用之后,人们通过fork检查返回值以区分子进程和父进程。

特别是在这种情况下,在fork()之后,将有两个具有相同代码和相同程序状态的进程(除了两者都将在child_pid变量中分配不同的值)。在父级中,它的非零值(对应于子级的pid)和子级,其值为零,因为fork在子级中返回零。 现在两个进程都将执行

if (child_pid > 0)

仅对父级为真,因此父进程将流入'if block'并且对于子进程为false,因此它将直接跳转到else部分并执行else块。

如果child_process id为零,该怎么办?
操作系统将始终为子项分配非零值,以便fork()可以工作。如果您以某种方式将子进程ID设置为零,则父进程将无法进入'if block'并执行else子块,该子进程与子进程相同。