FAT32パーティションにファイル(〜1 / s)を継続的に書き込む組み込みLinuxシステムは、中断されたときにパーティションを破損することがあります。プロセスは2つの方法で中断できます。電源を入れ直すか、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がクリーンであることを確認するためにコードに何かを追加する必要がありますか、および/またはcleankillを実行するための特別なkillallシグナル名がありますか?
3 に答える
コードが適切に記述されていれば、プロセスは をキャッチして、実行中の処理SIGTERM
を完全に停止し、開いているすべてのリソースを完全に閉じる必要があります。
コードを変更できず、SIGTERM
シグナルがプロセスを容赦なく停止することを既に確認している場合 (a のようにSIGKILL
)、それを適切に停止するためにできることは何もないと思います。
アプリケーションを変更して、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 の場合、シグナル ハンドラの後のコードは実行されません。
Modulo バグ。通常のファイル I/O を実行するプロセスを強制終了した結果、パーティション (およびファイルシステム) が破損する可能性はありません (つまり、パーティションをデバイスとして使用せず、raw ブロックを操作します)。
プロセスがシグナルを処理または無視することを気にしない場合はSIGTERM
、それと同じ無慈悲な方法でプロセスを強制終了しSIGKILL
ます。実際にシグナルで正常に終了しようとするプロセスの場合、単に kill しながらシャットダウンしてくださいSIGTERM
(キャッチすることは不可能です)。SIGKILL