0

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

3 回答 3

6

fork() 系统调用可能返回三种不同的状态:失败(<0)、父进程(>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)以刷新标准输出。

于 2010-03-27T23:28:21.507 回答
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;
}
于 2010-03-27T23:06:14.633 回答
0

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

于 2010-03-27T23:09:22.560 回答