在单进程的情况下,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进程,并不会发送给进程组的其他成员,所以他们并不能收到这个信号。