如何将参数传递给fork()创建的进程

时间:2012-11-19 20:21:23

标签: c linux operating-system fork system-calls

我想在C中使用 fork()创建流程的副本。 我无法弄清楚如何将参数传递给我的进程的副本。 例如,我想将一个整数传递给进程副本。

或者我该怎么做,如果我有一个循环,我调用fork()并希望将一个唯一值传递给进程(例如0 ... N)

for (int i = 0; i < 4; ++i) {
    fork();
    // pass a unique value to new processes.
}

5 个答案:

答案 0 :(得分:20)

关于fork()的好处是你自动生成的每个进程都会得到父进程的所有内容的副本,例如,假设我们想要将一个int myvar传递给两个孩子中的每一个进程,但我希望每个进程都有一个与父进程不同的值:

int main()
{
    int myvar = 0;
    if(fork())
        myvar = 1;
    else if(fork())
        myvar = 2;
    else
        myvar = 3;

    printf("I'm %d: myvar is %d\n", getpid(), myvar);
    return 0;
}

这样做可以使每个进程拥有myvar的“副本”及其自身的值。

I'm 8517: myvar is 1
I'm 8518: myvar is 2
I'm 8521: myvar is 3

如果您没有更改该值,则每个fork'd进程将具有相同的值。

答案 1 :(得分:7)

本地和全局变量在fork()中固有地保留,因此不需要“传递参数”。如果您在分叉过程中调用函数,则可以执行以下操作:

pid_t pid = fork();
if (pid == 0) {
    funcToCallInChild(argument);
    exit(0);
}

答案 2 :(得分:6)

我迟到了回复,但这就是我的做法:

const char *progname = "./yourProgName";
const char *argument1 = "arg1";
const char *argument2 = "arg2";

if (fork() == 0)
{
    // We are the child process, so replace the process with a new executable.  
    execl(progname, progname, argument1, argument2, (char *)NULL);
}
//  The parent process continues from here.

首先,fork()进程创建一个新进程。它仍然具有与旧存储空间相同的存储空间。 fork()返回父进程和子进程。如果fork()返回零,那么您就是子进程。然后子进程使用execl()将进程内存替换为新文件中的进程内存。

请注意,对execl()给出了两次progname。第一个是execl()实际上会尝试运行,第二个是argv [0]。您必须提供两者,否则参数计数将被关闭。 Progname必须包含所有必需的路径信息才能找到所需的可执行映像。

我在这个例子中给出了两个参数,但你可以传递任意数量的参数。它必须以NULL结束,我认为你必须将其转换为(char *),就像我展示一样。

这种方法为您提供了一个完全独立的过程,其中包含参数和唯一的pid。它可以在父进程终止后继续运行很长时间,也可以在父进程之前终止。

答案 3 :(得分:1)

请参阅exec() family函数。

编辑:如果您尝试初始化与基本过程相同的程序的副本,只需继续使用duskwuff建议的变量。

答案 4 :(得分:1)

您可以使用 clone()(它实际上由fork()本身使用)。它允许您将 arg 传递给您的输入功能。

http://linux.die.net/man/2/clone