0

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

4

3 回答 3

2

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

如果您无法修改代码,并且您已经观察到SIGTERM信号残酷地停止了该过程(就像 a 一样SIGKILL),我想您无法很好地停止它。

于 2013-01-28T15:52:45.330 回答
1

模错误,不会因为杀死执行常规文件 I/O 的进程而导致分区(和文件系统)损坏(即不能将分区作为设备使用,操作原始块)。

如果进程不关心处理或忽略信号,SIGTERM则会以同样无情的方式杀死它SIGKILL。对于实际上试图在信号上正常退出的进程,SIGTERM意味着你会关闭,而SIGKILL只是杀死(不可能抓住它)。

于 2013-01-28T15:53:56.333 回答
1

好吧,您可以修改您的应用程序以捕获除 SIGKILL 之外的任何信号。
可以在信号处理程序中执行关闭操作或清理
以下是设置处理程序以在某些致命信号发生时删除临时文件的简单示例:

#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 的情况下,信号处理程序之后的代码将不会执行。

于 2013-01-28T16:33:13.983 回答