apue.h

/*

本文为

UNIX环境高级编程(第3版) []W.Richard Stevens  Stephen A.Rago著,戚正伟 张亚英 尤正元

——北京:人民邮电出版社,2014.6

中自定义头文件<apue.h>.

附:书中实例的源码可以从www.apuebook.com获得。

*/


/*

*Our own header, to be included before all standard system headers.

*/


#ifndef _APUE_H


#define _APUE_H


#define_POSIX_C_SOURCE 200809L



#ifdefined(SOLARIS) /* Solaris 10 */


#define_XOPEN_SOURCE 600


#else


#define_XOPEN_SOURCE 700


#endif



#include<sys/types.h> /* some systems still require this */


#include<sys/stat.h>


#include<sys/termios.h> /* for winsize */


#ifdefined(MACOS) || !defined(TIOCGWINSZ)


#include<sys/ioctl.h>


#endif



#include<stdio.h> /* for convenience */


#include<stdlib.h> /* for convenience */


#include<stddef.h> /* for offsetof */


#include<string.h> /* for convenience */


#include<unistd.h> /* for convenience */


#include<signal.h> /* for SIG_ERR */




#define MAXLINE 4096 /*max line length */




/*


*Default file access permissions for new files.


*/


#define FILE_MODE (S_IRUSR| S_IWUSR | S_IRGRP | S_IROTH)



/*

*Default permissions for new directories.

*/


#define DIR_MODE (FILE_MODE| S_IXUSR | S_IXGRP | S_IXOTH)


typedef void Sigfunc(int); /*for signal handlers */


#define min(a,b) ((a)< (b) ? (a) : (b))


#define max(a,b) ((a)> (b) ? (a) : (b))


/*


*Prototypes for our own functions.


*/


char *path_alloc(size_t*); /* {Prog pathalloc} */


longopen_max(void); /* {Prog openmax} */


intset_cloexec(int); /* {Prog setfd} */


voidclr_fl(int, int);


voidset_fl(int, int); /* {Prog setfl} */


voidpr_exit(int); /* {Prog prexit} */


voidpr_mask(const char *); /* {Prog prmask} */


Sigfunc *signal_intr(int,Sigfunc *); /* {Prog signal_intr_function} */



voiddaemonize(const char *); /* {Prog daemoninit} */



voidsleep_us(unsigned int); /* {Ex sleepus} */


ssize_treadn(int, void *, size_t); /* {Prog readn_writen} */


ssize_twriten(int, const void *, size_t); /* {Prog readn_writen} */



intfd_pipe(int *); /* {Prog sock_fdpipe} */


intrecv_fd(int, ssize_t (*func)(int,


const void *, size_t)); /* {Prog recvfd_sockets} */


intsend_fd(int, int); /* {Prog sendfd_sockets} */


intsend_err(int, int,


const char *); /* {Prog senderr} */


intserv_listen(const char *); /* {Prog servlisten_sockets} */


intserv_accept(int, uid_t *); /* {Prog servaccept_sockets} */


intcli_conn(const char *); /* {Prog cliconn_sockets} */


intbuf_args(char *, int (*func)(int,


char **)); /* {Prog bufargs} */



inttty_cbreak(int); /* {Prog raw} */


inttty_raw(int); /* {Prog raw} */


inttty_reset(int); /* {Prog raw} */


voidtty_atexit(void); /* {Prog raw} */


structtermios *tty_termios(void); /* {Prog raw} */



intptym_open(char *, int); /* {Prog ptyopen} */


intptys_open(char *); /* {Prog ptyopen} */


#ifdef TIOCGWINSZ


pid_tpty_fork(int *, char *, int, const struct termios *,


const struct winsize *); /* {Prog ptyfork} */


#endif



int lock_reg(int,int, int, off_t, int, off_t); /* {Prog lockreg} */



#define read_lock(fd,offset, whence, len) \


lock_reg((fd),F_SETLK, F_RDLCK, (offset), (whence), (len))


#define readw_lock(fd,offset, whence, len) \


lock_reg((fd),F_SETLKW, F_RDLCK, (offset), (whence), (len))


#define write_lock(fd,offset, whence, len) \


lock_reg((fd),F_SETLK, F_WRLCK, (offset), (whence), (len))


#define writew_lock(fd,offset, whence, len) \


lock_reg((fd),F_SETLKW, F_WRLCK, (offset), (whence), (len))


#define un_lock(fd,offset, whence, len) \


lock_reg((fd),F_SETLK, F_UNLCK, (offset), (whence), (len))



pid_t lock_test(int,int, off_t, int, off_t); /* {Prog locktest} */



#define is_read_lockable(fd,offset, whence, len) \


(lock_test((fd),F_RDLCK, (offset), (whence), (len)) == 0)


#define is_write_lockable(fd,offset, whence, len) \


(lock_test((fd),F_WRLCK, (offset), (whence), (len)) == 0)



void err_msg(constchar *, ...); /* {App misc_source} */


void err_dump(constchar *, ...) __attribute__((noreturn));


void err_quit(constchar *, ...) __attribute__((noreturn));


void err_cont(int,const char *, ...);


void err_exit(int,const char *, ...) __attribute__((noreturn));


void err_ret(constchar *, ...);


void err_sys(constchar *, ...) __attribute__((noreturn));



void log_msg(constchar *, ...); /* {App misc_source} */


void log_open(constchar *, int, int);


void log_quit(constchar *, ...) __attribute__((noreturn));


void log_ret(constchar *, ...);


void log_sys(constchar *, ...) __attribute__((noreturn));


void log_exit(int,const char *, ...) __attribute__((noreturn));



void TELL_WAIT(void); /*parent/child from {Sec race_conditions} */


void TELL_PARENT(pid_t);


void TELL_CHILD(pid_t);


void WAIT_PARENT(void);


void WAIT_CHILD(void);



#endif /*_APUE_H */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值