title: fork子进程
data: 2019/3/21 20:24:39 toc: true ---这里实在学习socket编程前的小知识点,用来创建多个服务端
学习文档
速记
- fork并不保证父子进程的执行顺序,会存在父进程先比子进程结束,这个时候子进程的就可能由系统进程1( PID为 1 的 init)接管
- 子进程返回 0
- 父进程返回子进程的进程号 (PID)
- 粗浅的理解就是fork之后创建了一个一模一样的上下文,子进程也是从下一句话开始的,只不过fork获得的返回值在子进程中得到的是0
简单代码
#include#include #include int main(){ pid_t pid1; pid_t pid2; printf("%d\n", 1); pid1 = fork(); printf("%d\n", 2); pid2 = fork(); printf("pid1:%d, pid2:%d\n", pid1, pid2);}
这里会打印
122pid1:2101, pid2:2102pid1:2101, pid2:0pid1:0, pid2:2103pid1:0, pid2:0
也就是fork后从此处就有两个同样的进程开始了
僵尸进程signal(SIGCHLD, SIG_IGN)
SIGCHLD信号,子进程结束时, 父进程会收到这个信号。如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情 况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程 来接管)。