如上代码,运用了fork()函数创建子进程,waitpid()和kill(),但是不管如何都kill结束子进程失败。
linux kill子进程结束失败
如上代码,运用了fork()函数创建子进程,waitpid()和kill(),但是不管如何都kill结束子进程失败。
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注 【相关推荐】
- 这篇博客: Linux 下的KILL函数的用法中的 linux中waitpid系统调用 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读: 对于进程的一生可以用一些形象的比喻作一个小小的总结:随着一句fork,一个新进程呱呱落地,但它这时只是老进程的一个克隆。然后随着exec,新进程脱胎换骨,离家独立,开始了为人民服务的职业生涯。人有生老病死,进程也一样,它可以是自然死亡,即运行到main函数的最后一个”}”,从容地离我们而去;也可以是自杀,自杀有2种方式,一种是调用 exit函数,一种是在main函数内使用return,无论哪一种方式,它都可以留下遗书,放在返回值里保留下来;它还甚至能可被谋杀,被其它进程通过另外一些方式结束他的生命。进程死掉以后,会留下一具僵尸,wait和waitpid充当了殓尸工,把僵尸推去火化,使其最终归于无形。在linux中wait系统调用一文中介绍了其中的一个殓尸工wait, 下面介绍另一个waitpid,这个貌似复杂些。waitpid函数原型:#include<sys/types.h>/* 提供类型pid_t的定义 */#include<sys/wait.h>pid_twaitpid(pid_tpid,int*status,intoptions);从本质上讲,系统调用waitpid和wait的作用是完全相同的,但waitpid多出了两个可由用户控制的参数pid和options,从而为我们编程提供了另一种更灵活的方式。下面我们就来详细介绍一下这两个参数:pid从参数的名字pid和类型pid_t中就可以看出,这里需要的是一个进程ID。但当pid取不同的值时,在这里有不同的意义。1. pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。2. pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。3. pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。4. pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。optionsoptions提供了一些额外的选项来控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED两个选项,这是两个常数,可以用”|”运算符把它们连接起来使用,比如:ret=waitpid(-1,NULL,WNOHANG|WUNTRACED);如果我们不想使用它们,也可以把options设为0,如:ret=waitpid(-1,NULL,0);如果使用了WNOHANG参数调用waitpid,即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去。而WUNTRACED参数,用于跟踪调试,极少用到,就不说了。查看linux源代码 unistd.h 我们会发现,其实 wait 就是经过包装的 waitpid:staticinlinepid_twait(int*wait_stat){returnwaitpid(-1,wait_stat,0);}waitpid的返回值比wait稍微复杂一些,一共有3种情况:1. 当正常返回的时候,waitpid返回收集到的子进程的进程ID;2. 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;3. 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid就会出错返回,这时errno被设置为ECHILD;下面看一个简单的例子:下载:waitpid.c/* waitpid.c */#include<sys/types.h>#include<sys/wait.h>#include<unistd.h>#include<stdio.h>int main(){pid_t pc,pr;pc=fork();if (pc<0)/* fork错误*/{printf("fork error\n");exit(1);}else if(pc==0)/*在子进程中*/{sleep(10);exit(0);}else{do {/* 使用了WNOHANG参数,waitpid不会在这里等待 */pr=waitpid(pc,NULL,WNOHANG);if (pr==0){printf("No child exit\n");sleep(1);}}while (pr==0);if (pr==pc)printf("successfully get child %d\n",pr);elseprintf("wait child error\n");}return 0;}编译并运行:$ gcc -o waitpid waitpid.c$ ./waitpidNo child exitNo child exitNo child exitNo child exitNo child exitNo child exitNo child exitNo child exitNo child exitNo child exitsuccessfully get child 4607父进程经过10次失败的尝试之后,终于收集到了退出的子进程。父进程和子进程分别睡眠了10秒钟和1秒钟,代表它们分别作了10秒钟和1秒钟的工作。父子进程都有工作要做,父进程利用工作的简短间歇察看子进程的是否退出,如退出就收集它。
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- 这篇博客: Linux 下的KILL函数的用法中的 linux中waitpid系统调用 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
悬赏问题
- ¥15 远程访问linux主机超时
- ¥15 odoo17存货管理优势于中国国内该行业传统ERP或MES的详细解读和举例
- ¥15 CPU卡指令整合指令数据都在图片上
- ¥15 火车票关联12306问题
- ¥15 odoo17处理受托加工产品
- ¥15 如何用MATLAB编码图三的积分
- ¥15 圆孔衍射光强随孔径变化
- ¥15 MacBook pro m3max上用vscode运行c语言没有反应
- ¥15 ESP-PROG配置错误,ALL ONES
- ¥15 结构功能耦合指标计算