⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pipe4.c

📁 APUE(第二版)的随书源代码,与第一版的代码相比增加了一些章节的代码(详见第二版的说明)
💻 C
字号:
#include	<signal.h>#include	"ourhdr.h"static void	sig_pipe(int);		/* our signal handler */intmain(void){	int		n, fd1[2], fd2[2];	pid_t	pid;	char	line[MAXLINE];	if (signal(SIGPIPE, sig_pipe) == SIG_ERR)		err_sys("signal error");	if (pipe(fd1) < 0 || pipe(fd2) < 0)		err_sys("pipe error");	if ( (pid = fork()) < 0)		err_sys("fork error");	else if (pid > 0) {							/* parent */		close(fd1[0]);		close(fd2[1]);		while (fgets(line, MAXLINE, stdin) != NULL) {			n = strlen(line);			if (write(fd1[1], line, n) != n)				err_sys("write error to pipe");			if ( (n = read(fd2[0], line, MAXLINE)) < 0)				err_sys("read error from pipe");			if (n == 0) {				err_msg("child closed pipe");				break;			}			line[n] = 0;	/* null terminate */			if (fputs(line, stdout) == EOF)				err_sys("fputs error");		}		if (ferror(stdin))			err_sys("fgets error on stdin");		exit(0);	} else {									/* child */		close(fd1[1]);		close(fd2[0]);		if (fd1[0] != STDIN_FILENO) {			if (dup2(fd1[0], STDIN_FILENO) != STDIN_FILENO)				err_sys("dup2 error to stdin");			close(fd1[0]);		}		if (fd2[1] != STDOUT_FILENO) {			if (dup2(fd2[1], STDOUT_FILENO) != STDOUT_FILENO)				err_sys("dup2 error to stdout");			close(fd2[1]);		}		if (execl("./add2", "add2", (char *) 0) < 0)			err_sys("execl error");	}}static voidsig_pipe(int signo){	printf("SIGPIPE caught\n");	exit(1);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -