You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
953 B
62 lines
953 B
#include <stdio.h> |
|
#include <unistd.h> |
|
#include <signal.h> |
|
#include <errno.h> |
|
#include <sys/wait.h> |
|
#include <string.h> |
|
|
|
/* Make sure that a blocking syscall restarts if hit by a signal, |
|
and SA_RESTART is set */ |
|
|
|
static void handler(int s) |
|
{ |
|
} |
|
|
|
int main() |
|
{ |
|
int pid; |
|
int fds[2]; |
|
|
|
if (pipe(fds) == -1) { |
|
perror("FAIL: pipe\n"); |
|
return 1; |
|
} |
|
|
|
pid = fork(); |
|
|
|
if (pid == -1) { |
|
perror("fork failed"); |
|
return 1; |
|
} |
|
|
|
if (pid == 0) { |
|
char ch = '?'; |
|
int ret; |
|
struct sigaction sa; |
|
|
|
sa.sa_handler = handler; |
|
sigfillset(&sa.sa_mask); |
|
sa.sa_flags = SA_RESTART; |
|
|
|
sigaction(SIGUSR1, &sa, NULL); |
|
|
|
close(fds[1]); |
|
ret = read(fds[0], &ch, 1); |
|
|
|
if (ret != 1 || ch != 'x') |
|
fprintf(stderr, "FAIL: expected 1 byte, not %d/%s/%c\n", |
|
ret, strerror(errno), ch); |
|
} else { |
|
signal(SIGPIPE, SIG_IGN); |
|
|
|
close(fds[0]); |
|
sleep(1); |
|
kill(pid, SIGUSR1); |
|
sleep(1); |
|
write(fds[1], "x", 1); |
|
|
|
waitpid(pid, NULL, 0); |
|
} |
|
|
|
return 0; |
|
}
|
|
|