如果成功,子进程的PID将在父线程中返回, 并且在子线程中返回0。
p = fork();
我对这个函数的手册页感到困惑,p
是等于 0
还是 PID
?
fork()
会创建一个新的进程,所以您现在有两个相同的进程。为了区分它们,fork()
的返回值不同。在原始进程中,您会得到子进程的PID。在子进程中,您会得到0。p = fork();
if (0 == p)
{
// We're the child process
}
else if (p > 0)
{
// We're the parent process
}
else
{
// We're the parent process, but child couldn't be created
}
fork
后,旧进程和新创建的进程都会继续执行。 - Joachim Sauerfork()
调用之后继续执行。 - Oliver Charlesworthfork
失败了,它会返回-1
而不是0
,并适当地设置errno
。这个操作是在原始进程中执行的(由于没有创建任何进程,因此其不是父进程)。 - zwolp = fork(); /* 假设没有错误 */ /* 你现在有两个程序运行 */ -------------------- if (p > 0) { | if (p == 0) { printf("parent\n"); | printf("child\n"); ... | ...
/* fork/getpid test */
#include <sys/types.h>
#include <unistd.h> /* fork(), getpid() */
#include <stdio.h>
int main(int argc, char* argv[])
{
int pid;
printf("Entry point: my pid is %d, parent pid is %d\n",
getpid(), getppid());
pid = fork();
if (pid == 0) {
printf("Child: my pid is %d, parent pid is %d\n",
getpid(), getppid());
}
else if (pid > 0) {
printf("Parent: my pid is %d, parent pid is %d, my child pid is %d\n",
getpid(), getppid(), pid);
}
else {
printf("Parent: oops! can not create a child (my pid is %d)\n",
getpid());
}
return 0;
}
结果如下(在本例中,bash 的进程 ID 为 2249):
Entry point: my pid is 16051, parent pid is 2249
Parent: my pid is 16051, parent pid is 2249, my child pid is 16052
Child: my pid is 16052, parent pid is 16051
如果您需要在父进程和子进程之间共享一些资源(如文件、父进程ID等),请查看clone()
函数(适用于GNU C库,以及可能适用于其他一些库)。
这是很酷的部分。 它等同于双方。
嗯,并不完全是这样。但是一旦fork
返回,你现在有两份正在运行的程序副本! 两个进程。你可以将它们想象成交替的宇宙。在一个宇宙中,返回值是0
。在另一个宇宙中,它是新进程的ID
!
通常你会像这样拥有:
p = fork();
if (p == 0){
printf("I am a child process!\n");
//Do child things
}
else {
printf("I am the parent process! Child is number %d\n", p);
//Do parenty things
}
fork
,您就会拥有两个进程。该调用会向每个进程返回不同的值。int f;
f = fork();
if (f == 0) {
printf("I am the child\n");
} else {
printf("I am the parent and the childs pid is %d\n",f);
}
fork
没有创建进程,对吗? - compilerfork()
,是否会得到 -1 的返回值? - Heisenbergerrno
,因此您将知道它失败的原因。 - Noufal Ibrahimfork()
函数,然后生成一个子进程。在子进程生成时,fork()
已经执行完毕。fork()
准备返回,但是根据它是在父进程还是子进程中,它返回不同的值。在子进程中,它返回0,在父进程/线程中,它返回子进程的进程ID。fork
会被评估为 无操作
吗? - compiler0
表示什么,但它是否也表示没有额外的进程被创建? - compilerfork
一次,将会创建一个进程。我不明白您的问题。 - Noufal IbrahimFork会创建一个重复的进程和一个新的进程上下文。当它返回0值时,表示子进程正在运行,但当它返回其他值时,表示父进程正在运行。通常我们使用wait语句,以便子进程完成并且父进程开始执行。
getpid()
包含进来吗? 子进程中的getpid()
返回 0? - Shrinidhifork()
也是这样的。 - BoltClockfork
是返回食物的一小部分,但我可能错了。;-) - Thomas Matthews