不同进程通信方式常用的有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]#
941

被折叠的 条评论
为什么被折叠?



