如何将参数传递给由 fork() 创建的进程
Posted
技术标签:
【中文标题】如何将参数传递给由 fork() 创建的进程【英文标题】:How to pass arguments to processes created by fork() 【发布时间】:2012-11-07 19:58:23 【问题描述】:我想在 C 中使用 fork() 创建进程的副本。 我不知道如何将参数传递给我的流程副本。 例如,我想将一个整数传递给进程副本。
或者我该怎么做,如果我有一个调用 fork() 的循环并想将唯一值传递给进程(例如 0...N)
for (int i = 0; i < 4; ++i)
fork();
// pass a unique value to new processes.
【问题讨论】:
fork
创建一个正在进行的进程的副本,它不会启动进程。
阅读advancedlinuxprogramming.com
【参考方案1】:
我迟到了,但我是这样做的:
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 的完全独立的进程。它可以在父进程终止后很长时间继续运行,也可以在父进程之前终止。
【讨论】:
【参考方案2】: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
如果您没有更改该值,那么每个分叉的进程将具有相同的值。
【讨论】:
【参考方案3】:查看函数的exec()
family。
编辑:如果您尝试初始化与基本进程相同的程序的副本,只需按照黄昏的建议继续使用变量。
【讨论】:
【参考方案4】:本地和全局变量在fork()
中固有地保留,因此无需“传递参数”。如果您在分叉进程中调用函数,您可以执行以下操作:
pid_t pid = fork();
if (pid == 0)
funcToCallInChild(argument);
exit(0);
【讨论】:
【参考方案5】:您可以使用 clone() (实际上是由 fork() 本身使用的)。它允许您将 arg 传递给您的入口函数。
http://linux.die.net/man/2/clone
【讨论】:
不,请不要。clone
是一个复杂的、特定于 Linux 的系统调用,它需要对 Linux 有很好的了解,并且主要保留给少数大师实现线程库(à la pthread)。另请参阅 futex(7)
手册页。
@BasileStarynkevitch:没错。只有在你做一些真正的低级黑客攻击时才使用克隆——克隆的唯一一点是允许你在用户空间中做一些以前只能在内核空间中发生的事情,比如线程实现。它不是一般用途的系统调用。以上是关于如何将参数传递给由 fork() 创建的进程的主要内容,如果未能解决你的问题,请参考以下文章
如何设置参数并将参数传递给由 BIRT 报告设计器通过 BIRT API 创建的 BIRT 报告?