父子进程信号通信的诡异故事

不同进程通信方式常用的有socket,共享内存,信号signal 等,信号的主要特点是轻量级和快速响应,但传递的信息量有限.

故事开始是这样的


男主使用fork方式启动子进程以便拿到python进程pid,并通过向pid发送信号以停止子进程.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    pid_t pid;
    // 创建子进程
    pid = fork();
    if (pid < 0) { // fork失败
        fprintf(stderr, "Fork failed\n");
        return 1;
    } else if (pid == 0) { // 子进程执行的代码块
        // 使用execlp执行Python脚本
        int exitcode=execlp("python3", "python3", "/home/print_hello_world.py", (char *)NULL);
        //int exitcode=system("python3 /home/print_hello_world.py");
        printf("python exitcode %d",exitcode);
    } else { // 父进程
        sleep(3);
        // 向子进程发送SIGKILL/SIGTERM等信号
        if (kill(pid, SIGTERM) < 0) {
            perror("Error sending signal");
            return 1;
        }
        printf("Signal sent to process %d\n", pid);
        // 等待子进程结束
        wait(NULL);
        printf("Child process finished.\n");
        // 暂停
        pause();
    }

    return 0;
}

案例中使用execlp函数是ok

/tmp/tmp.Q9tq1GVnqS/cmake-build-debug127/testexe
Hello World
Hello World
Hello World
Signal sent to process 10502
python received SIGTERM (15)
Child process finished.
^C
Process finished with exit code 130

但使用system函数出现了问题,主进程已发起SIGTERM信号,也显示子进程结束了,但实际python进程还一直在运行,控制台也一直在输出

/tmp/tmp.Q9tq1GVnqS/cmake-build-debug127/testexe
Hello World
Hello World
Hello World
Signal sent to process 1787
Child process finished.
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
^C
Process finished with exit code 130

python进程也变成了僵尸进程
在这里插入图片描述
pstree看看进程树,原来system启动的python进程其实不是儿子而是孙子进程,这才没收到信号,信号都没爹处理了。。。

[root@localhost home]# pstree 
systemd─┬─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─agetty
        ├─auditd───{auditd}
        ├─chronyd
        ├─crond
        ├─dbus-daemon───{dbus-daemon}
        ├─gssproxy───5*[{gssproxy}]
        ├─irqbalance
        ├─java───44*[{java}]
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─mysqld───26*[{mysqld}]
        ├─nginx───nginx
        ├─polkitd───5*[{polkitd}]
        ├─python3
        ├─redis-server───2*[{redis-server}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd─┬─sshd─┬─bash───sleep
        │      │      ├─bash
        │      │      ├─bash───top
        │      │      └─sftp-server
        │      ├─sshd─┬─sftp-server
        │      │      └─testexe
        │      └─sshd─┬─bash───sleep
        │             ├─bash───pstree
        │             ├─bash───top
        │             └─sftp-server
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        └─tuned───4*[{tuned}]
[root@localhost home]# 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值