2010-03-27 71 views
0

我正试图在另一个进程中创建一个子进程。我正在用C语言编写这两个程序。首先我写一个虚拟的过程,这将是孩子的过程。它所做的只是在屏幕上写一个字符串。它独立运作。然后我编写另一个程序,这将是父进程。但是,我无法做到这一点。我试图一起使用fork和execl函数,但是我失败了。我也希望子进程不会终止,直到父进程终止。在Unix系统上创建子进程?

我应该如何编写父进程?

谢谢。

这里是子进程的代码:

#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); 
    } 
} 
+1

你说你“失败”,但你没有显示任何代码。你如何期待我们告诉你做错了什么?另外,父进程管理子进程,所以子进程总是在父进程之前完成。如果父进程先死了,那么祖父会采用子进程(最高为/ sbin/init,所有进程的最高祖父进程,永远不会死掉)。 – Juliano 2010-03-27 23:03:16

+0

好吧,对不起,我用代码编辑了我的问题。 – 2010-03-27 23:09:45

+1

在execl语句后添加一个perror(“execl”),看看会发生什么。 – Duck 2010-03-27 23:54:19

回答

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)来刷新标准输出。

+0

+1是的,几乎肯定execl的权限错误。 – Duck 2010-03-27 23:53:10

+0

感谢您的回复,它对我有很大的帮助。 – 2010-03-28 10:33:23

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

是的,父进程将退出,即使它的一些子/后代仍然存在。如果父母想等他们,那就必须故意这样做。 – MarkR 2010-03-27 23:12:55

0

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

+0

您可以在子进程完成其工作后但在退出之前将循环放入子进程中,等待父进程死掉(例如,通过等待连接到父进程的管道上的“EOF”)。 – caf 2010-03-28 02:14:46

+0

如果您控制子进程的源代码,请不要有任何错误,并且可以以某种方式保证它不会收到不受欢迎的信号,是的,但这些可能是很难保证的。 – 2010-03-28 02:24:33