apue和error
在做进程环境测试的时候,测试demo中出现了apue.h,而标准库中没有这个头文件和其中的函数定义,经查找需要在/usr/include中添加apue.h和error.c.原型可以去这个网站查找. http://www.apuebook.com.
1. /src/include/apue.h
1 /* Our own header, to be included before all standard system headers */
2
3 #ifndef _APUE_H
4 #define _APUE_H
5
6 #if defined(SOLARIS)
7 #define _XOPEN_SOURCE 500 /* Single UNIX Specification, Version 2 for Solaris 9 */
8 #define CMSG_LEN(x) _CMSG_DATA_ALIGN(sizeof(struct cmsghdr)+(x))
9 #elif !defined(BSD)
10 #define _XOPEN_SOURCE 600 /* Single UNIX Specification, Version 3 */
11 #endif
12
13 #include <sys/types.h> /* some systems still require this */
14 #include <sys/stat.h>
15 #include <sys/termios.h> /* for winsize */
16 #ifndef TIOCGWINSZ
17 #include <sys/ioctl.h>
18 #endif
19 #include <stdio.h> /* for convenience */
20 #include <stdlib.h> /* for convenience */
21 #include <stddef.h> /* for offsetof */
22 #include <string.h> /* for convenience */
23 #include <unistd.h> /* for convenience */
24 #include <signal.h> /* for SIG_ERR */
25
26 #define MAXLINE 4096 /* max line length */
27
28 /*
29 * Default file access permissions for new files.
30 */
31 #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
32
33 /*
34 * Default permissions for new directories.
35 */
36 #define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)
37
38 typedef void Sigfunc(int); /* for signal handlers */
39
40 #if defined(SIG_IGN) && !defined(SIG_ERR)
41 #define SIG_ERR ((Sigfunc *)-1)
42 #endif
43
44 #define min(a,b) ((a) < (b) ? (a) : (b))
45 #define max(a,b) ((a) > (b) ? (a) : (b))
46
47 /*
48 * Prototypes for our own functions.
49 */
50 char *path_alloc(int *); /* {Prog pathalloc} */
51 long open_max(void); /* {Prog openmax} */
52 void clr_fl(int, int); /* {Prog setfl} */
53 void set_fl(int, int); /* {Prog setfl} */
54 void pr_exit(int); /* {Prog prexit} */
55 void pr_mask(const char *); /* {Prog prmask} */
56 Sigfunc *signal_intr(int, Sigfunc *); /* {Prog signal_intr_function} */
57
58 int tty_cbreak(int); /* {Prog raw} */
59 int tty_raw(int); /* {Prog raw} */
60 int tty_reset(int); /* {Prog raw} */
61 void tty_atexit(void); /* {Prog raw} */
62 #ifdef ECHO /* only if <termios.h> has been included */
63 struct termios *tty_termios(void); /* {Prog raw} */
64 #endif
65
66 void sleep_us(unsigned int); /* {Ex sleepus} */
67 ssize_t readn(int, void *, size_t); /* {Prog readn_writen} */
68 ssize_t writen(int, const void *, size_t); /* {Prog readn_writen} */
69 void daemonize(const char *); /* {Prog daemoninit} */
70
71 int s_pipe(int *); /* {Progs streams_spipe sock_spipe} */
72 int recv_fd(int, ssize_t (*func)(int,
73 const void *, size_t));/* {Progs recvfd_streams recvfd_sockets} */
74 int send_fd(int, int); /* {Progs sendfd_streams sendfd_sockets} */
75 int send_err(int, int,
76 const char *); /* {Prog senderr} */
77 int serv_listen(const char *); /* {Progs servlisten_streams servlisten_sockets} */
78 int serv_accept(int, uid_t *); /* {Progs servaccept_streams servaccept_sockets} */
79 int cli_conn(const char *); /* {Progs cliconn_streams cliconn_sockets} */
80 int buf_args(char *, int (*func)(int,
81 char **)); /* {Prog bufargs} */
82
83 int ptym_open(char *, int); /* {Progs3 ptyopen_streams ptyopen_bsd ptyopen_linux} */
84 int ptys_open(char *); /* {Progs3 ptyopen_streams ptyopen_bsd ptyopen_linux} */
85 #ifdef TIOCGWINSZ
86 pid_t pty_fork(int *, char *, int, const struct termios *,
87 const struct winsize *); /* {Prog ptyfork} */
88 #endif
89
90 int lock_reg(int, int, int, off_t, int, off_t); /* {Prog lockreg} */
91 #define read_lock(fd, offset, whence, len) \
92 lock_reg((fd), F_SETLK, F_RDLCK, (offset), (whence), (len))
93 #define readw_lock(fd, offset, whence, len) \
94 lock_reg((fd), F_SETLKW, F_RDLCK, (offset), (whence), (len))
95 #define write_lock(fd, offset, whence, len) \
96 lock_reg((fd), F_SETLK, F_WRLCK, (offset), (whence), (len))
97 #define writew_lock(fd, offset, whence, len) \
98 lock_reg((fd), F_SETLKW, F_WRLCK, (offset), (whence), (len))
99 #define un_lock(fd, offset, whence, len) \
100 lock_reg((fd), F_SETLK, F_UNLCK, (offset), (whence), (len))
101
102 pid_t lock_test(int, int, off_t, int, off_t); /* {Prog locktest} */
103
104 #define is_read_lockable(fd, offset, whence, len) \
105 (lock_test((fd), F_RDLCK, (offset), (whence), (len)) == 0)
106 #define is_write_lockable(fd, offset, whence, len) \
107 (lock_test((fd), F_WRLCK, (offset), (whence), (len)) == 0)
108
109 void err_dump(const char *, ...); /* {App misc_source} */
110 void err_msg(const char *, ...);
111 void err_quit(const char *, ...);
112 void err_exit(int, const char *, ...);
113 void err_ret(const char *, ...);
114 void err_sys(const char *, ...);
115
116 void log_msg(const char *, ...); /* {App misc_source} */
117 void log_open(const char *, int, int);
118 void log_quit(const char *, ...);
119 void log_ret(const char *, ...);
120 void log_sys(const char *, ...);
121
122 void TELL_WAIT(void); /* parent/child from {Sec race_conditions} */
123 void TELL_PARENT(pid_t);
124 void TELL_CHILD(pid_t);
125 void WAIT_PARENT(void);
126 void WAIT_CHILD(void);
127
128 #include "error.c"
129
130 #endif /* _APUE_H */
2. error.c /src/include/error.c
1 #include "apue.h"
2 #include <errno.h> /* for definition of errno */
3 #include <stdarg.h> /* ISO C variable aruments */
4
5 static void err_doit(int, int, const char *, va_list);
6
7 /*
8 * Nonfatal error related to a system call.
9 * Print a message and return.
10 */
11 void
12 err_ret(const char *fmt, ...)
13 {
14 va_list ap;
15
16 va_start(ap, fmt);
17 err_doit(1, errno, fmt, ap);
18 va_end(ap);
19 }
20
21 /*
22 * Fatal error related to a system call.
23 * Print a message and terminate.
24 */
25 void
26 err_sys(const char *fmt, ...)
27 {
28 va_list ap;
29
30 va_start(ap, fmt);
31 err_doit(1, errno, fmt, ap);
32 va_end(ap);
33 exit(1);
34 }
35
36 /*
37 * Fatal error unrelated to a system call.
38 * Error code passed as explict parameter.
39 * Print a message and terminate.
40 */
41 void
42 err_exit(int error, const char *fmt, ...)
43 {
44 va_list ap;
45
46 va_start(ap, fmt);
47 err_doit(1, error, fmt, ap);
48 va_end(ap);
49 exit(1);
50 }
51
52 /*
53 * Fatal error related to a system call.
54 * Print a message, dump core, and terminate.
55 */
56 void
57 err_dump(const char *fmt, ...)
58 {
59 va_list ap;
60
61 va_start(ap, fmt);
62 err_doit(1, errno, fmt, ap);
63 va_end(ap);
64 abort(); /* dump core and terminate */
65 exit(1); /* shouldn't get here */
66 }
67
68 /*
69 * Nonfatal error unrelated to a system call.
70 * Print a message and return.
71 */
72 void
73 err_msg(const char *fmt, ...)
74 {
75 va_list ap;
76
77 va_start(ap, fmt);
78 err_doit(0, 0, fmt, ap);
79 va_end(ap);
80 }
81
82 /*
83 * Fatal error unrelated to a system call.
84 * Print a message and terminate.
85 */
86 void
87 err_quit(const char *fmt, ...)
88 {
89 va_list ap;
90
91 va_start(ap, fmt);
92 err_doit(0, 0, fmt, ap);
93 va_end(ap);
94 exit(1);
95 }
96
97 /*
98 * Print a message and return to caller.
99 * Caller specifies "errnoflag".
100 */
101 static void
102 err_doit(int errnoflag, int error, const char *fmt, va_list ap)
103 {
104 char buf[MAXLINE];
105
106 vsnprintf(buf, MAXLINE, fmt, ap);
107 if (errnoflag)
108 snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",
109 strerror(error));
110 strcat(buf, "\n");
111 fflush(stdout); /* in case stdout and stderr are the same */
112 fputs(buf, stderr);
113 fflush(NULL); /* flushes all stdio output streams */
114 }
wsksec@gmail.com
Pressing on Toward the Goal