首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何安全地杀死Linux进程?

如何安全地杀死Linux进程?
EN

Stack Overflow用户
提问于 2013-01-28 23:47:34
回答 3查看 2.3K关注 0票数 0

向FAT32分区连续写入文件(~1/s)的嵌入式Linux系统偶尔会在中断时损坏分区。该过程可以通过两种方式中断:重新启动电源,或者使用musb_hdrc/gadget通过USB将文件复制到主机或从主机复制文件。musb_hdrc/gadget用于将对分区的访问从内部嵌入式控制切换到USB,以便将文件传输到外部主机或从外部主机传输文件。解决方案可能是执行一个killall process-name,但这会安全地杀死Linux进程吗?IOW:进程是否会完成已经启动的任何文件IO,或者仍然会有损坏的分区?根据the killall man page If no signal name is specified SIGTERM is sent.的说法,是否需要在代码中添加一些东西来确保kill是干净的,以及/或者是否有一个特殊的kill信号名称来进行干净的kill?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-29 00:33:14

您可以修改您的应用程序以捕获除SIGKILL之外的任何信号。

可以在信号处理程序中执行关闭操作或清理

下面是一个简单的示例,说明如何设置一个处理程序,以便在发生某些致命信号时删除临时文件:

代码语言:javascript
复制
#include <signal.h>

 void
 termination_handler (int signum)
 {
   printf ("Caught signal %d\n", sig);
   switch(signum)
   {
       case SIGINT:
       printf ("CTRL C not allowed\n");
       break;

       case SIGTERM:
       struct temp_file *p;
       for (p = temp_file_list; p; p = p->next)
           unlink (p->name);
       exit(1);
       break;

       default:
   ...
   }
 }

 int
 main (void)
 {
   ...
   if (signal (SIGINT, termination_handler) == SIG_IGN)
     signal (SIGINT, SIG_IGN);
   if (signal (SIGHUP, termination_handler) == SIG_IGN)
     signal (SIGHUP, SIG_IGN);
   if (signal (SIGTERM, termination_handler) == SIG_IGN)
     signal (SIGTERM, SIG_IGN);
   ...
 }

在SIGTERM的情况下,信号处理程序之后的代码将不会执行。

票数 1
EN

Stack Overflow用户

发布于 2013-01-28 23:52:45

如果代码写得很好,进程应该捕获SIGTERM并干净利落地停止它正在做的事情,并干净利落地关闭所有打开的资源。

如果您不能修改代码,并且您已经观察到SIGTERM信号会粗暴地停止进程(就像SIGKILL一样),那么我猜您无法很好地停止它。

票数 2
EN

Stack Overflow用户

发布于 2013-01-28 23:53:56

Modulo错误,没有分区(和文件系统)损坏可能的结果,杀死一个进程,执行常规的文件I/O (即,不工作与分区作为一个设备,操纵原始块)。

如果进程不处理或忽略信号,SIGTERM将像SIGKILL一样毫不留情地杀死它。对于实际尝试在收到信号时优雅地退出的进程,SIGTERM表示请您关闭,而SIGKILL只是终止(不可能捕获它)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14565724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档