/* Adapted from https://sourceware.org/pipermail/cygwin/2020-March/244219.html */ #include #include #include #include #include #include #include #include #define FIFO "/tmp/myfifo" #define nsubproc 5 #define nmessages 4 #define pid_len 4 int error (const int n, const char *name) { fprintf (stderr, "\n%d\t%s:\t%d\t%s\n", getpid (), name, n, strerror (n)); return n; } int main () { if (mkfifo (FIFO, S_IRUSR | S_IWUSR | S_IWGRP) < 0 && errno != EEXIST) return error (errno, "mkfifo"); int rfd = open (FIFO, O_RDWR); if (rfd < 0) return error (errno, "open reader"); for (int i = 0; i < nsubproc; i++) { pid_t pid = fork (); if (pid < 0) return error (errno, "fork"); if (pid == 0) { printf ("child %d\n", getpid ()); for (int j = 0; j < nmessages; j++) { char buf[pid_len + 2]; /* +1 for newline, +1 for nul */ int wfd = open (FIFO, O_WRONLY | O_NONBLOCK); if (wfd < 0) _exit (error (errno, "open writer")); sprintf (buf, "%d\n", getpid ()); ssize_t nwritten = write (wfd, buf, strlen (buf)); if (nwritten < 0) error (errno, "write"); /* printf ("i = %d, j = %d, nwritten = %zd\n", i, j, nwritten); */ close (wfd); } _exit (0); } } printf ("parent\n"); char buf[pid_len + 2]; for (int i = 0; i < nsubproc; i++) for (int j = 0; j < nmessages; j++) { if (read (rfd, buf, nsubproc) < 0) error (errno, "read"); buf[pid_len + 1] = '\0'; printf ("%s", buf); } close (rfd); }