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 }
apue和error的更多相关文章
- multiple definition of `err_sys' 《UNIX环境高级编程》
本文地址:http://www.cnblogs.com/yhLinux/p/4079930.html 问题描述: [点击此处直接看解决方案] 在练习<UNIX环境高级编程>APUE程序清单 ...
- [APUE]进程控制(上)
一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是init进程,在自举(bootstr ...
- [APUE]标准IO库(下)
一.标准IO的效率 对比以下四个程序的用户CPU.系统CPU与时钟时间对比 程序1:系统IO 程序2:标准IO getc版本 程序3:标准IO fgets版本 结果: [注:该表截取自APUE,上表中 ...
- APUE中fcntl.h的使用及O_SYNC在Mac与Ubuntu下的测试
此部分测试涉及到APUE V3中,第三章的图3-12到图3-14. 通过fcntl.h提供的功能,修改fd的文件属性,本处增加O_SYNC功能,并测试其效果. 本文涉及代码: tree ch3 ch3 ...
- APUE fig 1.10示例代码的完善--对提示符及输入回车的优化
APUE 第3版第15页的shell2.c示例程序,运行效果如下: gcc ol.shell.c -o origin_shell ./origin_shell % date 2015年12月13日 星 ...
- 关于apue.3e中apue.h的使用
关于apue.3e中apue.h的使用 近来要学一遍APUE第三版,并于此开博做为记录. 先下载源文件: # url: http://http//www.apuebook.com/code3e.htm ...
- APUE 习题3-2 实现dup2,要求不使用fcntl函数。
int mydup2(int oldfd, int newfd) { int tfd = 0; if (newfd < 0) { err_sys(&quo ...
- APUE学习--第三版apue编译
第三版apue编译: 1. 首先在 http://www.apuebook.com/ 下载源码解压: tar zxvf src.3e.tar.gz 看完Readme可知,直接执 ...
- APUE环境配置
1.到http://www.apuebook.com/选择相应的版本下载源码,我的是2013版的 2.将apue.h拷到/usr/include目录下 3.将error.c拷到源文件下,编译的时候带上 ...
随机推荐
- sql server 2008 安装过程与创建建sql server登录用户
1.sql server 下载安装包路径:http://pan.baidu.com/s/1qWuzddq 2.安装过程图解教程 ,参照网址:http://jingyan.baidu.com/album ...
- redis 笔记06 发布与订阅、事务、慢查询日志、监视器
发布与订阅 1. 服务器状态在pubsub_channels字典保存了所有频道的订阅关系:SUBSCRIBE命令负责将客户端和被订阅的频道关联到这个字典里面,而UNSUBSCRIBE命令则负责 解除客 ...
- 鸟哥的linux私房菜学习记录之开机流程、模块管理与Loader
- PL/SQL快捷键
F8 执行所选中的SQL语句 当光标在sql语句末尾/开头 时 按Shift Home /Shift End 选中该语句
- 30个深度学习库:按Python、C++、Java、JavaScript、R等10种语言分类
30个深度学习库:按Python.C++.Java.JavaScript.R等10种语言分类 包括 Python.C++.Java.JavaScript.R.Haskell等在内的一系列编程语言的深度 ...
- linux信号机制 - 用户堆栈和内核堆栈的变化【转】
转自:http://itindex.net/detail/16418-linux-%E4%BF%A1%E5%8F%B7-%E5%A0%86%E6%A0%88 此文只简单分析发送信号给用户程序后,用户堆 ...
- 使用jprofiler8远程监控weblogic的配置方法
jprofiler8的注册码:L-Larry_Lau@163.com#36573-fdkscp15axjj6#25257 未完待续
- include指令
include:文件加载指令(用于在JSP文件中插入一个包含文本或代码的文件.把文件插入后和原来的JSP文件合并成一个新的JSP页面.) 语法格式:<%@ include file=" ...
- HDU-1042 N!
首先明白这是大数问题,大数问题大多采用数组来实现.如何进位.求余等.比如1047 (Integer Inquiry): 对于1042问题 计算10000以内数的阶乘,因为10000的阶乘达到35660 ...
- c# Beginlnvoke 委托
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...