Bas*_*sti 15 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.
}
Run Code Online (Sandbox Code Playgroud)
Mik*_*ike 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;
}
Run Code Online (Sandbox Code Playgroud)
这样做可以让每个进程都拥有myvar自己的值的"副本" .
I'm 8517: myvar is 1
I'm 8518: myvar is 2
I'm 8521: myvar is 3
Run Code Online (Sandbox Code Playgroud)
如果您没有更改该值,则每个fork'd进程将具有相同的值.
本地和全局变量本身保留在a中fork(),因此不需要"传递参数".如果您在分叉过程中调用函数,则可以执行以下操作:
pid_t pid = fork();
if (pid == 0) {
funcToCallInChild(argument);
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
我迟到了回应,但这是我如何做到的:
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.
Run Code Online (Sandbox Code Playgroud)
首先,fork()进程以创建新进程.它仍然具有与旧存储空间相同的存储空间.fork()返回父进程和子进程.如果fork()返回零,那么您就是子进程.然后子进程使用execl()将进程内存替换为新文件中的进程内存.
请注意,对execl()给出了两次progname.第一个是execl()实际上会尝试运行,第二个是argv [0].您必须提供两者,否则参数计数将被关闭.Progname必须包含所有必需的路径信息才能找到所需的可执行映像.
我在这个例子中给出了两个参数,但你可以传递任意多个参数.它必须以NULL结束,我认为你必须像我展示的那样将其转换为(char*).
这种方法为您提供了一个完全独立的过程,包含参数和唯一的pid.它可以在父进程终止后继续运行很长时间,也可以在父进程终止之前终止.