admin 管理员组文章数量: 887021
c语言代码父进程杀死子进程,c
我正在尝试编写我的shell克隆。 现在,我正在将SIGINT发送到前台进程,这是我的工作方式:
void performPipeCmd(char *cmd[maxCmdSize][maxArgSize], int waitOption, int numOfCmds){
waitpid(-1, NULL, WNOHANG);
int fd[2];
int status,
fdIn = 0;
pid_t childpid;
if(pipe(fd) == -1) {
perror("Pipe failed");
exit(1);
}
for(int i = 0; i < numOfCmds; i++){
status;
switch ((childpid = fork())){
case -1:
perror("fork");
break;
case 0:
dup2(fdIn, 0);
if (i+1
dup2(fd[1], 1);
close(fd[0]);
execvp(cmd[i][0], cmd[i]);
printf("execvp failure\n");
exit(EXIT_FAILURE);
break;
default:
currentPid = childpid; //setting current childpid
setpgid(childpid, childpid);
waitpid(childpid, &status, waitOption);
close(fd[1]);
fdIn = fd[0];
break;
}
}
}
这是我的信号处理程序:
void sigIntHandler(int dummy){
killpg(currentPid,SIGINT);
}
现在我有两个问题:
即使此程序仅杀死前台进程,我也不知道为什么它不影响后台进程,即使将currentPid设置为后台进程的pid。
离开外壳后如何杀死外壳的子进程? 杀死主进程后,子进程仍然存在:
Shell正在运行:
10061 13511 13511 13511 ? -1 Ssl 1000 0:03 \_ /usr/lib/gnome-terminal/gnome-terminal-server
13511 13520 13520 13520 pts/0 14242 Ss 1000 0:00 \_ bash
13520 14242 14242 13520 pts/0 14242 S+ 1000 0:00 | \_ ./a.out
14242 14243 14243 13520 pts/0 14242 S 1000 0:00 | \_ sleep 100000
离开外壳后:
10061 13511 13511 13511 ? -1 Ssl 1000 0:04 \_ /usr/lib/gnome-terminal/gnome-terminal-server
13511 13520 13520 13520 pts/0 13520 Ss+ 1000 0:00 | \_ bash
13511 13966 13966 13966 pts/1 14256 Ss 1000 0:00 | \_ bash
13966 14256 14256 13966 pts/1 14256 R+ 1000 0:00 | \_ ps ajfx
10061 14243 14243 13520 pts/0 13520 S 1000 0:00 \_ sleep 100000
我试图这样做,但它不起作用:
if(checkIfShouldStop(input, result)) {
killpg(getgid(),SIGINT);
break;
}
本文标签: c语言代码父进程杀死子进程 c
版权声明:本文标题:c语言代码父进程杀死子进程,c 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1715720078h643957.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论