一,僵死进程
1,僵死进程及其处理:
僵死进程的概念:父进程未结束,子进程结束了,而且父进程没有处理子进程的结束(父进程未获取子进程的退出码)
**孤儿进程:**父进程结束,子进程未结束,那么子进程就是一个孤儿进程,孤儿进程被系统的init进程接管
服务器程序部署在Linux系统上,服务器程序一般是不结束的。
注意问题:
1,C中就是堆的情况,malloc—》free (野指针)
2,C++中,new—》delete
3,Linux中的僵死进程
僵死进程的处理
在父进程中调用系统方法:pid_t wait(int *status); (调用时,实参是传递一个变量的地址,返回子进程的退出状态,返回处理的子进程的pid,如果失败,返回-1)
wait方法会阻塞调用这个方法,直到有一个子进程结束。
一个父进程可能会存在多个子进程 ,而一次wait调用只能处理一个子进程(第一个结束子进程)
调用wait:子进程结束,父进程开始执行到结束。两个进程串行运行
调用wait后成串行,不是并发
二,信号
信号就是系统预先定义好某些特定的事件,信号可以被发送,可以被接受,发送和接受的主体就是进程
如果一个进程接收到了一个信号,就表示他接受到了一个发生了的事件。
信号的定义:vim /usr/include/bits/signum.h
1,如何修改进程接收到某些信号时,做的处理—修改信号响应方式
当进程接受SIGINT信号后,打印“hello world“
void sig_fun(int sign)
{
printf("hello world\n");//进程接收到信号才会执行的
)
int main()
{
//signal方法第一个参数是要修改的信号类型
// 第二个参数信号处理函数的地址-》 (忽略)SIG_IGN (默认)SIG_DFL 自定义函数
signal(SIGINT,sig fun);//不会阻塞等待信号的产生
while(1)
{
sleep(2)
printf("proccess running\n");//在循环中,暂停调用signal
}
exit(0);//进程结束
}
修改信号的响应方式,第一次接收到信号打印hello wrold,第二次将信号结束当前进程
三,利用信号来处理僵死进程(异步处理)
SIGCHLD:当子进程状态改变后,会默认将此信号发送给父进程。
当进程接收到SIGCHLD信号后,在调用wait方法处理僵死进程。wait方法就不会阻塞;
1,使用signal方法修改SIGCHLD信号相应方式。
2,信号的处理函数–》执行wait。
将信号修改加在代码之前,当它子进程结束调用,结束子进程,进入父进程,不管有多少个子进程,它内核会自己调用。
将wait放在signal中在函数前执行,它在中间会自己调用fun方法结束子进程
总结
1,僵死进程
父进程未结束,子进程结束,但是父进程未处理子进程的退出
在父进程中调用wait方法,获取子进程的退出状态。特点:wait会阻塞,直到一个子进程结束
2,信号
信号是系统预先定义好的特定的一些事件,信号可以被产生,也可以被接受。接受和产生的主体都是进程。
(1)信号响应方式
默认---------》SIG_DFL
忽略---------》SIG_IGN
自定义-------》用户自己编写一个函数地址
(2)如何修改信号的响应方式
signal(int sig_type ,void (*sig_fun)(int));
............................SIG_DFL
............................SIG_IGN
//只要进程调用此方法修改了一个信号的响应方式,则之后接受到此信号,就按照修改的方式去处理。