僵死进程和信号

一,僵死进程

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
//只要进程调用此方法修改了一个信号的响应方式,则之后接受到此信号,就按照修改的方式去处理。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Linux 中,僵尸进程和孤儿进程都是指与父进程不再有联系的进程,它们通常是由于进程管理不当或程序错误导致的。 **僵尸进程**是已经完成执行任务,但其父进程还没有来得及处理其退出状态的进程。当进程完成执行后,它的退出状态(也称为退出码或终止状态)会被保存在系统中,直到父进程通过 `wait` 或 `waitpid` 等函数来获取该状态。如果父进程没有处理该状态,那么该进程就会成为僵尸进程,占用系统资源。要清理僵尸进程,可以使用 `kill` 命令向其父进程发送 `SIGCHLD` 信号,或者重新编写程序,使其正确处理子进程的退出状态。 **孤儿进程**是指其父进程已经退出或被终止,但其自身仍在运行的进程。孤儿进程会被 `init` 进程进程号为 `1`)接管,`init` 进程会定期检查系统中是否有孤儿进程,并且将其的父进程设置为 `init` 进程。要避免孤儿进程的产生,可以在父进程退出之前,等待子进程的退出,或者将子进程的父进程设置为 `init` 进程。 可以使用 `ps` 命令来查看系统中的僵尸进程和孤儿进程。使用以下命令可以查看所有僵尸进程: ``` ps aux | grep 'Z' ``` 其中,`aux` 选项用于显示所有进程,`grep 'Z'` 用于查找所有状态为 `Z` 的进程,即僵尸进程。 使用以下命令可以查看所有孤儿进程: ``` ps -ejH ``` 其中,`-e` 选项用于显示所有进程,`-j` 选项用于以层次结构的形式显示进程,`-H` 选项用于显示所有孤儿进程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值