ctrl+c与kill -2的区别
2024-01-08 11:34:22
单进程场景
在单进程的情况下,ctrl+c和kill -2是一模一样的,都是向指定的进程发送SIGINT信号.
如果进程中注册了捕捉SIGINT信号的处理函数,那么这个信号会被进程处理,例如:
void processB() {
// Set signal handler for SIGINT in process B
signal(SIGINT, sigint_handler);
printf("I am B process\n");
while (1) {
printf("B: Working...\n");
sleep(1);
}
}
如果没有注册这个信号捕捉,当信号触发时,操作系统将会终止这个进程的运行.相关资源也会由系统回收.
非单进程场景
试想一种场景,A进程作为父进程启动之后拉起子进程B。这个时候对A进程发送kill -2或者ctrl + c,这两种情况下,产生的结果是否一致?
我们可以写一个简单的测试程序来验证我们的想法:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void sigint_handler(int signum) {
printf("Capture Ctrl+C signal:%d\n", signum);
// exit(EXIT_SUCCESS);
}
void processB() {
// Set signal handler for SIGINT in process B
signal(SIGINT, sigint_handler);
printf("I am B process\n");
while (1) {
printf("B: Working...\n");
sleep(1);
}
}
int main() {
// Set signal handler for SIGINT in process A
signal(SIGINT, sigint_handler);
pid_t child_pid = fork();
if (child_pid == -1) {
perror("Fork failed");
exit(EXIT_FAILURE);
}
if (child_pid > 0) {
// This is the parent process
printf("I am a process\n");
while (1) {
printf("Parent: Working...\n");
sleep(1);
}
} else {
// This is the child process
processB();
}
return 0;
}
使用指令:gcc -o cotrol_and_C_test cotrol_and_C_test.c
来编译你的测试程序。
测试发现:
1,对当前进程A执行ctrl+c时,A/B进程同时退出
2,对当前进程B执行kill -2时,只有A进程退出,B进程依旧在运行
现象其实很好解释:
1,对当前进程A执行ctrl+c时,A/B进程同时退出
--> 当A进程启动B进程之后,AB进程同属与同一个进程组,你可以使用ps -e -o pid,pgid,cmd 指令查看:
38057 0 [kworker/3:0-cgr]
38069 0 [kworker/2:2-cgr]
38080 0 [kworker/0:1-cgr]
38149 38149 ./cotrol_and_C_test
38150 38149 ./cotrol_and_C_test
38151 38151 ps -e -o pid,pgid,cm
当发生ctrl+c时,这个信号是同时发送给了这个进程组中所有的进程,这其中也包括了进程B
2,对当前进程B执行kill -2时,只有A进程退出,B进程依旧在运行
--> 这种情况下,因为执行的是kill -2 $pid, 这个时候SIGINT信号只发送给了$pid进程,并不会发送给进程组的其他成员,所以他们并不能收到这个信号。
文章来源:https://blog.csdn.net/kill150/article/details/135451767
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!