1 #include <stdio.h> 2 #include <unistd.h> 3 #include <signal.h> 4 #include <errno.h> 5 #include <sys/wait.h> 6 #include <string.h> 7 8 /* Make sure that a blocking syscall restarts if hit by a signal, 9 and SA_RESTART is set */ 10 11 static void handler(int s) 12 { 13 } 14 15 int main() 16 { 17 int pid; 18 int fds[2]; 19 20 if (pipe(fds) == -1) { 21 perror("FAIL: pipe\n"); 22 return 1; 23 } 24 25 pid = fork(); 26 27 if (pid == -1) { 28 perror("fork failed"); 29 return 1; 30 } 31 32 if (pid == 0) { 33 char ch = '?'; 34 int ret; 35 struct sigaction sa; 36 37 sa.sa_handler = handler; 38 sigfillset(&sa.sa_mask); 39 sa.sa_flags = SA_RESTART; 40 41 sigaction(SIGUSR1, &sa, NULL); 42 43 close(fds[1]); 44 ret = read(fds[0], &ch, 1); 45 46 if (ret != 1 || ch != 'x') 47 fprintf(stderr, "FAIL: expected 1 byte, not %d/%s/%c\n", 48 ret, strerror(errno), ch); 49 } else { 50 signal(SIGPIPE, SIG_IGN); 51 52 close(fds[0]); 53 sleep(1); 54 kill(pid, SIGUSR1); 55 sleep(1); 56 write(fds[1], "x", 1); 57 58 waitpid(pid, NULL, 0); 59 } 60 61 return 0; 62 } 63