#include #include #include #include int capacity; static void sig_alarm_popen(int signo){ printf ("Popen capacity= %d\n", capacity); exit (0); } static void sig_alarm_pipe(int signo){ printf ("Pipe capacity= %d\n", capacity); exit (0); } int main(void) { pid_t pid; FILE *pf; int pfd[2]; int i, status; pid=fork(); if (pid==0) { /*child*/ FILE *pf; signal(SIGALRM, sig_alarm_popen); if ((pf = popen("./p2.child", "w")) == NULL) { perror("popen"); exit(1); } capacity=0; alarm(1); while (fprintf(pf, "a")>0) { capacity++; alarm(1); } } else { sleep(1); signal(SIGALRM, sig_alarm_pipe); if (pipe(pfd) < 0) { perror("pipe"); exit(1); } if (fork()==0) { dup2(pfd[0], 0); close(pfd[1]); execl("./p2.child", "p2.child", (char *) 0); perror("exec"); exit(127); } capacity=0; alarm(1); close(pfd[0]); while (write(pfd[1], "a", 1)>0) { capacity++; alarm(1); } } }