Date: Wed, 31 Jan 1996 15:29:45 +1100 From: Bruce Evans <bde@zeta.org.au> To: current@freebsd.org, dyson@freebsd.org Subject: new pipes fail several tests #3 Message-ID: <199601310429.PAA13400@godzilla.zeta.org.au>
index | next in thread | raw e-mail
The fixes for #1 and #2 seem to work. Thanks.
New pipes are uninterruptible, unlike old pipes and named pipes.
The SA_RESTART bit in sa.sa_flags is cleared so no syscalls should
be restarted when the signal occurs.
This is probably because sys_pipe.c converts all or almost all of
the nonzero returned by tsleep() to ERESTART.
The signal catcher wasn't called. I think it should be called
even for syscalls that are restarted.
Bruce
#include <sys/types.h>
#include <sys/wait.h>
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#define check(what, expected) assert((what, expected))
sig_atomic_t caught;
void catch(int s)
{
caught = 1;
}
int main(void)
{
char buf[1];
int fd[2];
struct sigaction osa, sa;
pid_t pid, rpid;
int r;
int status;
r = pipe(fd);
check("pipe", r == 0);
pid = fork();
check("fork", pid != -1);
switch(pid)
{
case 0:
alarm(5);
sa.sa_handler = catch;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
r = sigaction(SIGUSR1, &sa, &osa);
check("sigaction", r == 0);
#ifdef OK
sleep(3);
check("sleep", caught == 1);
#else
r = read(fd[0], buf, sizeof buf);
printf("read %d bytes, errno = %d, caught = %d\n", r, errno, caught);
check("read", r == -1);
check("read", errno == EINTR);
check("read", caught == 1);
#endif
r = sigaction(SIGUSR1, &osa, NULL);
check("sigaction2", r == 0);
r = close(fd[0]);
check("close", r == 0);
r = close(fd[1]);
check("close2", r == 0);
break;
default:
sleep(1);
r = close(fd[0]);
check("close3", r == 0);
r = kill(pid, SIGUSR1);
check("kill", r == 0);
rpid = wait(&status);
printf("wait returned %ld, status = %d, errno = %d\n", rpid, status, errno);
check("wait", rpid == pid);
check("wait", status == 0);
break;
}
return 0;
}
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199601310429.PAA13400>
