プロセスにシグナルを送信する必要があります。プロセスがこのシグナルを受信すると、いくつかのことを実行します。これは、Cでどのように最適に達成されますか?
プロセスにシグナルを送信する方法はkill(pid, signal);
です。ただし、固有の競合状態のため、シグナルは親から直接の子メッセージを除いて、プロセス間通信の堅牢な手段ではないことに注意してください。 。パイプ、ファイル、ディレクトリ、名前付きセマフォ、ソケット、共有メモリなどはすべて、プロセス間通信に対して非常に優れたアプローチを提供します。
Unixの亜種のいずれかを使用している場合は、次のマニュアルページが役立ちます。
man 2 kill
man 2 signal
man 2 sigvec
kill
+ fork
実行可能なPOSIXの例
楽しい時間:
#define _XOPEN_SOURCE 700
#include <assert.h>
#include <signal.h>
#include <stdbool.h> /* false */
#include <stdio.h> /* perror */
#include <stdlib.h> /* EXIT_SUCCESS, EXIT_FAILURE */
#include <sys/wait.h> /* wait, sleep */
#include <unistd.h> /* fork, write */
void signal_handler(int sig) {
char s1[] = "SIGUSR1\n";
char s2[] = "SIGUSR2\n";
if (sig == SIGUSR1) {
write(STDOUT_FILENO, s1, sizeof(s1));
} else if (sig == SIGUSR2) {
write(STDOUT_FILENO, s2, sizeof(s2));
}
signal(sig, signal_handler);
}
int main() {
pid_t pid;
signal(SIGUSR1, signal_handler);
signal(SIGUSR2, signal_handler);
pid = fork();
if (pid == -1) {
perror("fork");
assert(false);
} else {
if (pid == 0) {
while (1);
exit(EXIT_SUCCESS);
}
while (1) {
kill(pid, SIGUSR1);
sleep(1);
kill(pid, SIGUSR2);
sleep(1);
}
}
return EXIT_SUCCESS;
}
コンパイルして実行します。
gcc -std=c99 signal_fork.c
./a.out
結果:
SIGUSR1
SIGUSR2
SIGUSR1
SIGUSR2
....
ただし、シグナルを処理するときは多くの複雑さがあることに注意してください。
man 7 signal
、SA_RESTART
sig_atomic_t
の場合にのみシグナルハンドラからアクセスできます: sig_atomic_tは実際にどのように機能しますか?Ubuntu 17.10でテスト済み、 GitHubアップストリーム 。