函数说明:一个现有的线程调用fork()函数,会创建一个子进程(child process)。子进程是父进程的副本,会获得父进程数据空间、堆、栈等资源的副本,但是父子进程不共享这些存储空间。由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
返回值:(1)父进程返回新创建子进程的进程ID;
(2)子进程返回0;
(3)如果出现错误,fork返回一个负值;
- #include <unistd.h>
- #include <stdio.h>
- int main ()
- {
- pid_t fpid; //fpid表示fork函数返回的值
- int count=0;
- fpid=fork();
- if (fpid < 0)
- printf("error in fork!");
- else if (fpid == 0)
- {
- printf("i am the child process, my process id is %d/n ",getpid());
- printf("子进程/n");
- count++;
- }
- else
- {
- printf("i am the parent process, my process id is %d/n",getpid());
- printf("父进程/n");
- count++;
- }
- printf("统计结果是: %d/n",count);
- return 0;
- }
运行结果是:
i am the child process, my process id is 5574
子进程
统计结果是: 1
i am the parent process, my process id is 5573
父进程
统计结果是: 1
一位网友解释fpid的值为什么在父子进程中不同。“其实就相当于链表,进程形成了链表,父进程的fpid(p意味point)指向子进程的进程id
每个进程都有一个唯一的进程标识符(process ID),可以通过getpid()函数获得,还有一个记录父进程pid的变量,可以通过getppid()函数获得变量的值。
fork执行完毕后,出现两个进程