【发布时间】:2022-01-20 14:46:38
【问题描述】:
以下场景:
-
process_1.bin开始doSomeThing.sh -
doSomeThing.sh应该先杀死process_1.bin,然后继续自己运行并做一些其他事情
我尝试过 fork、exec、screen、p_threads、daemon,还有一些没有成功。
每次doSomeThing.sh启动并杀死process_1.bin,它都会杀死自己,因为父进程被杀死。
doSomeThing.sh 告诉我:“kill 信号后退出程序!”
很遗憾,这也不起作用:
pid_t pid;
pid = fork();
if (pid < 0)
exit(EXIT_FAILURE);
if (pid > 0) // Success: Let the parent terminate
exit(EXIT_SUCCESS);
if (setsid() < 0)
exit(EXIT_FAILURE);
pid = fork();
if (pid < 0)
exit(EXIT_FAILURE);
if (pid > 0)
exit(EXIT_SUCCESS);
// umask(0);
// chdir("/");
switch(pid)
{
case -1: // Fork() has failed
perror ("fork");
break;
case 0: // This is processed by the child
// deamon(0,0);
system("/root/doSomeThing.sh");
// system("screen -dmS doSomeThing /root/doSomething.sh")
// char *name[] = {
// "/bin/bash",
// "-c",
// "/root/doSomeThing.sh",
// NULL
// };
// if(execvp(name[0], name) < 0)
// perror("execvp");
exit(0);
break;
default: // This is processed by the parrent
break;
}
我怎样才能指挥doSomeThing.sh 杀死process_1.bin 但仍然保持自己的生命?
【问题讨论】:
-
如果你想很好地控制信号,你可能不能使用
system。分叉您自己的进程来执行脚本(例如,通过exec("/bin/sh" ....或类似方法)并控制信号处理。 -
我已经试过了:``` pid_t pid; pid = fork();如果(pid 0) // 成功:让父节点终止 exit(EXIT_SUCCESS);如果 (setsid() 0)退出(EXIT_SUCCESS); char *name[] = { "/bin/bash", "-c", "/root/doSomeThing.sh", NULL }; switch(pid) { ... case 0: execvp(name[0], name) break; ... } ```
-
你能在
doSomething.sh中显示代码吗?子进程杀死其父进程并不是一个特别好的主意(杀父和杀母在大多数圈子中都是不受欢迎的)。process1.bin是你展示一些零碎代码的 C 程序吗?doSomething.sh是一个 shell 脚本吗?它如何确定其父进程的PID? -
@ikegami — 在编程圈子里,父母的过程有时确实需要杀婴;令人沮丧的是,父母的过程常常不得不等待他们的孩子死去。多进程编程是一门病态的生意!
-
如果您对
fork()的调用返回一个正值(子进程的pid),则您已经退出当前进程(即父进程)。为什么还要再杀一次?如果您的子进程不执行脚本而是执行其他操作(睡眠 300,找到 10 亿个素数),会发生什么?它会死吗?
标签: c linux process parent kill