Johan Herland <johan@xxxxxxxxxxx> writes: > Maybe I need to do something to the close() call as well? What happens > on close() after EPIPE? You should be OK (you could try this). -- >8 -- #include <stdio.h> #include <errno.h> #include <stdlib.h> #include <signal.h> #include <string.h> int main(int ac, char **av) { int pipefd[2]; int child; if (pipe(pipefd) < 0) { fprintf(stderr, "pipe failed: %s\n", strerror(errno)); exit(1); } child = fork(); if (child < 0) { fprintf(stderr, "fork failed: %s\n", strerror(errno)); exit(1); } else if (child == 0) { char buf[1024]; ssize_t sz; /* the child reads from the parent but does not talk back */ close(pipefd[1]); /* emulate reading a bit, then dying without cleaning up */ sz = read(pipefd[0], buf, sizeof(buf)); fprintf(stderr, "read %lu bytes, and will die\n", (unsigned long) sz); exit(1); } else { const char data[] = "abcdefg"; size_t len = sizeof(data); size_t written = 0; /* the parent writes to the child but does not listen */ close(pipefd[0]); /* we will rite to the pipe even after the child is gone */ signal(SIGPIPE, SIG_IGN); /* write, write, write, ... */ while (1) { ssize_t sz = write(pipefd[1], data, len); if (sz < 0) { /* error */ fprintf(stderr, "write failed (%s) after writing" " %lu bytes\n", strerror(errno), (unsigned long) written); break; } written += sz; } errno = 0; if (close(pipefd[1])) fprintf(stderr, "close failed: %s\n", strerror(errno)); else fprintf(stderr, "close ok\n"); } exit(0); } -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html