一、概念
二、演示案例1
此add2程序作为下面演示案例2的协同进程
#include #include #include #include #define MAXLINE 1024 int main() { int n, int1, int2; char line[MAXLINE]; while ((n = read(STDIN_FILENO, line, MAXLINE)) > 0) { line[n] = 0; /* null terminate */ if (sscanf(line, "%d%d", &int1, &int2) == 2) { sprintf(line, "%d\n", int1 + int2); n=strlen(line); if (write(STDOUT_FILENO, line, n) != n) perror("write error"); } else { if (write(STDOUT_FILENO, "invalid args\n", 13) != 13) perror("write error"); } } exit(0); }
#include #include #include #include #define MAXLINE 1024 #define MAXLINE 1024 static void sig_pipe(int); /* our signal handler */ int main() { int n, fd1[2], fd2[2]; pid_t pid; char line[MAXLINE]; if (signal(SIGPIPE, sig_pipe) == SIG_ERR) perror("signal error"); if (pipe(fd1) < 0 || pipe(fd2) < 0) perror("pipe error"); if ((pid = fork()) < 0) { perror("fork error"); } else if (pid > 0) { //父进程 close(fd1[0]); close(fd2[1]); while (fgets(line, MAXLINE, stdin) != NULL) { n=strlen(line); if (write(fd1[1], line, n) != n) perror("write error to pipe"); if ((n = read(fd2[0], line, MAXLINE)) < 0) perror("read error from pipe"); if (n == 0) { printf("child closed pipe\n"); break; } line[n] = 0; /* null terminate */ if (fputs(line, stdout) == EOF) perror("fputs error"); } if (ferror(stdin)) perror("fgets error on stdin"); exit(0); } else { //子进程 close(fd1[1]); close(fd2[0]); if (fd1[0] != STDIN_FILENO) { if (dup2(fd1[0], STDIN_FILENO) != STDIN_FILENO) perror("dup2 error to stdin"); close(fd1[0]); } if (fd2[1] != STDOUT_FILENO) { if (dup2(fd2[1], STDOUT_FILENO) != STDOUT_FILENO) perror("dup2 error to stdout"); close(fd2[1]); } if (execl("./add2", "add2", (char *)0) < 0) perror("execl error"); } exit(0); } static void sig_pipe(int signo) { printf("SIGPIPE caught\n"); exit(1); }
#include #include int main() { int int1, int2; char line[MAXLINE]; while (fgets(line, MAXLINE, stdin) != NULL) { if (sscanf(line, "%d%d", &int1, &int2) == 2) { if (printf("%d\n", int1 + int2) == EOF) perror("printf error"); } else { if (printf("invalid args\n") == EOF) perror("printf error"); } } exit(0); }