c - 忽略父 pid 程序上的 Ctr+c
问题描述
我正在尝试制作自己的外壳,并且正在尝试获取 Ctrl+c 以便它关闭子进程,而不是父进程(my_shell)。
这是我的分叉代码:
jobs_list[0].pid = fork();
if (jobs_list[0].pid == 0) {
// Child process
if (execvp(argumentos[0], argumentos) == -1) {
perror("lsh");
}
exit(EXIT_FAILURE);
} else if (jobs_list[0].pid < 0) {
// Error forking
perror("lsh");
} else {
while(jobs_list[0].pid != 0){
pause();
}
}
所以我的父母在等待孩子,当我在一个正在跑步的孩子上按 ctrl+c 时,它会正确地杀死它,但我想忽略什么时候只有我父亲在跑步。我的 ctrl+c 信号处理程序是:
void ctrlc(int signum) {
printf("I am the process with PID %d , and the kid process is %d \n",pid,jobs_list[0].pid);
if(jobs_list[0].pid > 0){ //when 0 means there is a child
printf("I KILL THE PROCESS %d \n",jobs_list[0].pid);
kill(jobs_list[0].pid,SIGINT);
signal(SIGINT, ctrlc);
}else{
signal(SIGINT, ctrlc);
}
}
当我有一个孩子睡觉并点击 Ctrl+c 时:
gnadal: ~~>sleep 40
Parse_args()--> token 0: sleep
Parse_args()--> token 1: 40
I am the process with PID 7987 , and the kid process is 7988
I KILL THE PROCESS 7988
但是当我空闲时,我只是退出程序本身。为什么当我在父程序上按 Ctrl+c 时我的 shell 停止?
谢谢你的帮助。
解决方案
推荐阅读
- python - pygame中文本的上半部分未显示
- eclipse - Spring Tools Suite do not show Apache Tomcat in New Server
- php - The controllers namespace must start with your application namespace: App
- angularjs - Adal js 库 - this.adalService.acquireToken 方法在首次登录时给出“令牌更新操作因超时而失败”
- eclipse - Eclipse 氧气 3 maven 不编译 java 文件
- python-3.x - 如何从 Python 脚本调用 Google Cloud Build
- python - ImportError:无法导入名称“页面”
- java - 尝试通过 PHP POST METHOD 提交 android 表单数据
- javascript - 删除 Firebase 中某个键下的数据
- node.js - 如何使用 Multer 上传 blob?