私はなどについて読んEINTR
でwrite(2)
いて、プログラムでそれをチェックする必要があるかどうかを判断しようとしています。健全性チェックとして、それに遭遇するプログラムを書こうとしました。プログラムは永久にループし、ファイルに繰り返し書き込みます。
次に、別のシェルで次のコマンドを実行します。
while true; do pkill -HUP test; done
ただし、test.cからの出力は.
、シグナルハンドラーからのsだけです。なぜ失敗のSIGHUP
原因にならないのですか?write(2)
test.c:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
void hup_handler(int sig)
{
printf(".");
fflush(stdout);
}
int main()
{
struct sigaction act;
act.sa_handler = hup_handler;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction(SIGHUP, &act, NULL);
int fd = open("testfile", O_WRONLY);
char* buf = malloc(1024*1024*128);
for (;;)
{
if (lseek(fd, 0, SEEK_SET) == -1)
{
printf("lseek failed: %s\n", strerror(errno));
}
if (write(fd, buf, sizeof(buf)) != sizeof(buf))
{
printf("write failed: %s\n", strerror(errno));
}
}
}