在Unix系统上创建子进程?

时间:2010-03-27 22:47:33

标签: c unix parent-child child-process

我正在尝试在另一个进程中创建子进程。我用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);
  }
}

3 个答案:

答案 0 :(得分:6)

fork()系统调用可能会返回三种不同的状态:failure(&lt; 0),parent process(&gt; 0)或child process(== 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)以刷新标准输出。

答案 1 :(得分:1)

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;
}

答案 2 :(得分:0)

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