C/CPP的fork机制总结
序言
之前虽然对C的fork机制有所了解, 但是时间一长就有点忘了,现在来做个总结。先提出以下一些问题:
-
C中return 和exit有何不同?
return 会返回到上一层调用的地方, 而exit会使得进程直接退出
-
C 中父进程fork出子进程和父进程, 子进程如何执行?
父进程,子进程都会执行fork命令的下一条指令, fork在父进程中返回子进程pid(创建成功时), 在子进程中返回0, 当
fork() == 0
子进程中使用return 后, 子进程就会与父进程执行除fork限定(用fork 调用控制执行的代码)外的代码, 此时的情况需要特别注意。可以阅读 fork 调用的原理。
-
Linxu 程序的存储空间安排?
-
Linux Fork进程时的COW技术?父进程和子进程的逻辑地址, 物理地址?
-
父子进程A, B使用不同的信号处理函数 但是父子A,B进程公用同一个stat个参数, 子进程B退出(被kill)时, 父进程A也退出,(程序结构main ->fork A, A fork B), 未解之谜😂, 可以实现一个这样的程序, 重现一下, 了解下stat参数的作用, 阅读资料, wait/waitpid函数
test code:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
pid_t pid;
int restart_flag = 0;
int data1 = -99;
void sig_chld(int signo)
{
pid_t pid;
int stat;
while((pid = waitpid(-1, &stat, WNOHANG)) > 0)
{
printf("pid:%ld crash, caught signal:%d\n",pid, signo);
restart_flag = 1;
}
return;
}
void child_func(){
printf("child_func, pid:%ld, ppid:%ld, data1=%d\n", getpid(), getppid(), data1);
sleep(1);
exit(0);
}
int main()
{
restart_flag = 0;
int data_share_test = -99;
if((pid = fork()) < 0)
return -1;
else if(pid == 0){
child_func();
}
signal(SIGCHLD, sig_chld);
while(1){
if(restart_flag == 1){
if((pid = fork()) < 0)
return -1;
else if(pid == 0)
{
child_func();
}
restart_flag = 0;
}
printf("pid:%ld, ppid:%ld, data1=%d\n", getpid(), getppid(), data1);
data1++;
sleep(3);
}
return 0;
}