【问题标题】:Creating a child process on Unix systems?在 Unix 系统上创建子进程?
【发布时间】:2010-03-27 22:47:33
【问题描述】:

我正在尝试在另一个进程中创建一个子进程。我正在用 C 语言编写这两个程序。首先,我编写了一个虚拟进程,它将成为子进程。它所做的只是在屏幕上写一个字符串。它自己运作良好。然后我编写另一个程序,它将成为父进程。但是,我不能让它发生。我正在尝试同时使用 fork 和 execl 函数,但我失败了。我还希望子进程在父进程终止之前不会终止。

父进程应该怎么写?

谢谢。

这是子进程的代码:

#include <stdio.h>

int main(void) {
  while(1) {
    printf("*");
    sleep(1);
  }
}

这是父进程:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
  if (fork()) {
    while(1) {
      printf("-\n");
      sleep(5);
    }
  } else {
    execl("./", "dummy", (char *)0);
  }
}

【问题讨论】:

  • 您说您“失败”,但您没有显示任何代码。你希望我们如何告诉你哪里做错了?此外,父进程管理子进程,因此子进程总是在父进程之前完成。如果父进程首先死亡,祖父进程会收养子进程(直到 /sbin/init,所有进程的曾祖父进程,它永远不会死亡)。
  • 好的,抱歉,我用代码编辑了我的问题。
  • 在你的 execl 语句之后添加一个 perror("execl") 看看会发生什么。

标签: c unix parent-child child-process


【解决方案1】:

fork() 系统调用可能返回三种不同的状态:失败(0)或子进程(==0)。您必须正确测试返回值。

int pid = fork();

if (pid < 0) {
  /* handle error */
  perror("fork");
  exit(1);
} else if (pid > 0) {
  /* parent code */
} else {
  /* child code */
}

您的 execl() 系统调用错误。第一个参数是要执行的程序的路径,“./”无效,至少应该是“./dummy”。按照惯例,下一个参数是命令名称(已执行程序中的 argv[0]),它可能是第一个参数的重复。所以:

execl("./dummy", "dummy", NULL);

另外,请注意,子程序中的printf("*") 语句可能会缓冲,您不会在终端上看到任何内容。您必须在末尾添加“\n”或调用fflush(stdout) 来刷新标准输出。

【讨论】:

  • 感谢您的回复,对我帮助很大。
【解决方案2】:

C语言中fork的基本使用

int PID = fork();

if( PID < 0 ) {
    //fail
    return PID;
}
else if( !PID ) {
    //child process
    return exec( prog, args );
} 
else {
    //parent process
    return 0;
}

【讨论】:

  • 是的,父进程将退出,即使它的一些子/后代还活着。如果父母想等他们,就必须故意这样做。
【解决方案3】:

没有办法强制子进程在完成后“不终止”(您仍然可以在父进程中向wait 获取有关它如何终止的信息,仅此而已)。除此之外,网络上fork/exec 的许多示例中的任何一个,例如this one,都应该可以工作——你为什么不试试看它是否能如你所愿(在这种情况下你只需要改变你在自己的尝试中所做的任何不同的事情)。如果它不能按预期工作(除了这个 A 中的第一句不可能;-),请编辑您的代码以添加有关代码行为与您预期不同的大量细节。

【讨论】:

  • 您可以在子进程完成工作后退出之前在子进程中放置一个循环,等待父进程死亡(例如,在连接到父母)。
  • 如果你控制子进程的源代码,永远不会有任何错误,可以保证它不会收到不受欢迎的信号,是的,但那些可能很漂亮很难保证。
猜你喜欢
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 2012-09-02
  • 2018-06-23
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
相关资源
最近更新 更多