您现在的位置: 天极网 > unix高级编程指南22

unix高级编程指南22

来源:日月光华站精华区 作者: 责任编辑: 发表时间:2000-06-28 00:00 评论()
Unix 操作系统
p>B.1 我们的头文件

  在正文中的大多数程序都包含头文件ourhdr.h,这示于程序B.1中。其中定义了常数(例如MAXLINE)和我们自编函数的原型。因为大多数程序序包含下列头文件:、(其中有exit函数原型),以及(其中包含所有标准Unix函数的原型),所以ourhdr.h包含了这些系统头文件,同时还包含了。这样就减少了本书正文中所有程序的长度。

/* Our own header, to be included *after* all standard system headers */
#ifndef __ourhdr_h
#define __ourhdr_h
#include /* required for some of our prototypes */
#include /* for convenience */
#include /* for convenience */
#include /* for convenience */
#include /* for convenience */
#define MAXLINE 4096 /* max line length */
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
/* default file access permissions for new files */
#define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)
/* default permissions for new directoris */
typedef void Sigfunc(int); /* for signal handlers */
/* 4.3BSD Reno doesnt define SIG_ERR */
#if defined(SIG_IGN) && !defined(SIG_ERR)

#define SIG_ERR ((Sigfunc *)-1)

#endif
#define min(a,b) ((a) $#@60; (b) ? (a) : (b))
#define max(a,b) ((a) $#@62; (b) ? (a) : (b))

/* prototypes for our own functions */
char *path_alloc(int *); /* {Prog pathalloc} */
int open_max(void); /* {Prog openmax} */
void clr_fl(int, int); /* {Prog setfl} */
void set_fl(int, int); /* {Prog setfl} */
void pr_exit(int); /* {Prog prexit} */
void pr_mask(const char *); /* {Prog prmask} */
Sigfunc *signal_intr(int, Sigfunc *);/* {Prog signal_intr_function} */
int tty_cbreak(int); /* {Prog raw} */
int tty_raw(int); /* {Prog raw} */
int tty_reset(int); /* {Prog raw} */
void tty_atexit(void); /* {Prog raw} */
#ifdef ECHO /* only if has been included */

struct termios *tty_termios(void); /* {Prog raw /

#endif
void sleep_us(unsigned int); /* {Ex sleepus} */
ssize_t readn(int, void *, size_t);/* {Prog readn} */
ssize_t writen(int, const void *, size_t);/* {Prog writen} */
int daemon_init(void); /* {Prog daemoninit}*/
int s_pipe(int *); /* {Progs svr4_spipebsdspipe} */
int recv_fd(int, ssize_t (*func)(int, const void *, size_t));
/* {Progrecvfd_svr4 recvfd_43bsd} */
int send_fd(int, int); /* {Progs sendfd_svr4 sedfd_43bsd} */
int send_err(int, int, const char *);/* {Prog senderr} */
int serv_listen(const char *); /* {Progs servlisten_svr4 servliten_44bsd} */
int serv_accept(int, uid_t *); /* {Progs servaccept_svr4 servacept_44bsd} */
int cli_conn(const char *); /* {Progs cliconn_svr4 cliconn_4bsd} */
int buf_args(char *, int (*func)(int, char **));/* {Progbufargs} */
int ptym_open(char *); /* {Progs ptyopen_svr4 pyopen_44bsd} */
int ptys_open(int, char *); /* {Progs ptyopen_svr4 ptyopen_4bsd} */
#ifdef TIOCGWINSZ

pid_t pty_fork(int *, char *, const struct termios *,const struct winsize *); /* {Prog ptyfork*/

#endif
int lock_reg(int, int, int, off_t, int, off_t);
/* {Proglockreg} */
#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);/* {Proglocktest} */
#define is_readlock(fd, offset, whence, len) \lock_test(fd, F_RDLCK, offset, whence, len)
#define is_writelock(fd, offset, whence, len) \lock_test(fd, F_WRLCK, offset, whence, len)
void err_dump(const char *, ...); /* {App misc_source} */
void err_msg(const char *, ...);
void err_quit(const char *, ...);
void err_ret(const char *, ...);
void err_sys(const char *, ...);
void log_msg(const char *, ...); /* {App misc_source} */
void log_open(const char *, int, int);
void log_quit(const char *, ...);
void log_ret(const char *, ...);
void log_sys(const char *, ...);
void TELL_WAIT(void); /* parent/child from {Sec race_condition} */
void TELL_PARENT(pid_t);
void TELL_CHILD(pid_t);
void WAIT_PARENT(void);
void WAIT_CHILD(void);
#endif /* __ourhdr_h */

程序B.1 我们的头文件ourhdr.h

  在程序中先包括一系统头文件,然后再包括ourhdr.h,这样就能解决某些系统之间的差别(例如4.3BSDReno中没有定义SIG_ERR),并且也可定义一些我们的函数原型,而这些仅当包括一般系统头文件之后才是需要的。当尚未定义某个结构就在原型中引用该结构时,某些ANSI C编译会认为不正常。

相关报道

1

本文导航>>

  • 1.unix高级编程指南22
天极服务|关于我们|About us|网站律师|RSS订阅|友情合作|加入我们|天极动态|网站地图|意见反馈|MSN/QQ上看天极
Copyright (C) 1999-2012 Yesky.com, All Rights Reserved 版权所有 天极网络