如何将parameter passing给由fork()创build的进程

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

或者我该怎么做,如果我有一个循环,我打电话fork(),并希望传递一个唯一的值进程(例如0 … N)

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

Solutions Collecting From Web of "如何将parameter passing给由fork()创build的进程"

关于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的过程将会有相同的值。

本地和全局变量本质上保留在fork() ,所以不需要“传递参数”。 如果你在分叉进程中调用一个函数,你可以这样做:

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

我迟迟没有回应,但这是我如何做到的:

 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。 它可以在父进程终止后很长时间继续运行,也可以在父进程之前终止。

你可以使用clone() (实际上由fork()本身使用)。 它可以让你传递一个arg到你的入口函数。

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

请参阅exec()系列函数。

编辑:如果你正在尝试初始化相同的程序作为基础过程的副本,只需继续使用由黄昏建议的变量。