16

我想在 C 中使用fork()创建进程的副本。我不知道如何将参数传递给我的进程的副本。例如,我想将一个整数传递给进程副本。

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

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

5 回答 5

22

好的部分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

如果您没有更改该值,那么每个分叉的进程将具有相同的值。

于 2012-11-19T21:19:58.517 回答
7

局部和全局变量本质上是跨 a 保留的fork(),因此无需“传递参数”。如果您在分叉进程中调用函数,则可以执行以下操作:

pid_t pid = fork();
if (pid == 0) {
    funcToCallInChild(argument);
    exit(0);
}
于 2012-11-19T20:32:06.627 回答
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() 将进程内存替换为新文件中的内存。

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

我在这个例子中给出了两个参数,但是你可以传递任意多的参数。它必须以 NULL 终止,我认为您必须像我展示的那样将其转换为 (char *)。

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

于 2015-06-05T14:52:16.050 回答
1

请参阅函数exec()

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

于 2012-11-19T20:23:13.763 回答
1

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

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

于 2012-11-19T20:27:51.580 回答