标签:
1 // CopyStandardInputToStandardOutput.cpp 2 #include "../apuesunyj.h" 3 4 #define BUFFSIZE 4096 5 6 int main(void) 7 { 8 int n; 9 char buf[BUFFSIZE]; 10 11 while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0) 12 { 13 if (write(STDOUT_FILENO, buf, n) != n) 14 { 15 err_sys("write error"); 16 } 17 } 18 if (n < 0) 19 { 20 err_sys("read error"); 21 } 22 exit(0); 23 }
1 // apuesunyj.h 2 #ifndef APUE_SUNYJ 3 #define APUE_SUNYJ 4 5 #include <errno.h> 6 #include <stdio.h> 7 #include <string.h> 8 #include <stdarg.h> 9 #include <stdlib.h> 10 #include <stdint.h> 11 #include <unistd.h> 12 13 void err_quit(const char *fmt, ...); 14 void err_sys(const char *fmt, ...); 15 16 17 #endif
1 // error.cpp 2 #include "apuesunyj.h" 3 4 int64_t const MAXLINE = 4096; // max line length 5 /* 6 * * Print a message and return to caller. 7 * * Caller specifies "errnoflag". 8 * */ 9 static void err_doit(int errnoflag, int error, const char *fmt, va_list ap) 10 { 11 char buf[MAXLINE]; 12 13 vsnprintf(buf, MAXLINE, fmt, ap); 14 if (errnoflag) 15 snprintf(buf + strlen(buf), MAXLINE - strlen(buf), ": %s", strerror( 16 error)); 17 strcat(buf, "\n"); 18 fflush(stdout);/* in case stdout and stderr are the same */ 19 fputs(buf, stderr); 20 fflush(NULL);/* flushes all stdio output streams */ 21 } 22 23 /* 24 * * Fatal error unrelated to a system call. 25 * * Print a message and terminate. 26 * */ 27 void err_quit(const char *fmt, ...) 28 { 29 va_list ap; 30 31 va_start(ap, fmt); 32 err_doit(0, 0, fmt, ap); 33 va_end(ap); 34 exit(1) ; // process terminate, not just like return, totally different 35 } 36 37 /* 38 * * Fatal error related to a system call. 39 * * Print a message and terminate. 40 * */ 41 void err_sys(const char *fmt, ...) 42 { 43 va_list ap; 44 45 va_start(ap, fmt); 46 err_doit(1, errno, fmt, ap); 47 va_end(ap); 48 exit(1) ; 49 }
APUE_1.4CopyStandardInputToStandardOutput
标签:
原文地址:http://www.cnblogs.com/sunyongjie1984/p/4284773.html