fork()用于UNIX下面创建子进程。用fork()创建的子进程将完全复制父进程的数据空间、堆、栈,但父子进程不共享这些存储空间。
fork()执行成功之后,会对子进程和父进程分别返回值,给子进程的返回值是0,给父进程的返回值是子进程的pid。
当然,子进程不会跟父进程同时结束,即使父进程已经结束,子进程仍然可以做它的事情。
// fork.c
// 执行过程中可以用ps -u username来观察进程的状态
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
static void process1();
static void process2();
int main()
{
// 开启两个子进程
pid_t pid;
if ((pid=fork()) == 0)
{
process1();
_exit(0);
}
else if(pid>0)
{
sleep(2);
} if ((pid=fork()) == 0)
{
process2();
_exit(0);
}
else if(pid>0)
{
sleep(2);
}
}
static void process1()
{
fprintf(stderr, "child1 running...\n");
fprintf(stderr, "parent pid = %d\n", getppid());
sleep(25);
fprintf(stderr, "child1 is over.\n");
}
static void process2()
{
fprintf(stderr, "child2 running...\n");
fprintf(stderr, "parent pid = %d\n", getppid());
sleep(10);
fprintf(stderr, "child2 is over.\n");
}
Unix编程书上介绍的fork处理进制是用switch实现。
pid_t pid;
switch(pid=fork())
{
case -1:
fprintf(stderr, "fork error\n");
case 0:
// 子进程代码
default:
// 父进程代码
}
Unix编程书上介绍的fork处理进制是用switch实现。