zoukankan      html  css  js  c++  java
  • 【UNIX高级编程】关于UNIX编程环境的配置(apue.h和error.h)

    一,配置

            apue.h是作者自己写的一个文件,包含了常用的头文件,系统不自带。其中包含了常用的头文件,以及出错处理函数的定义。使用起来确实很方便。

             想要使用,还要进行下面操作,完成相关配置.

             在http://www.apuebook.com/下载src.tar.gz源代码的压缩包。

       1、解压至/home/user/目录下

       2、修改 Make.defines.linux中的WKDIR=/home/xxx/apue.2e,为WKDIR=/home/user/apue.2e

       3、返回至apue.2e目录下面,修改linux.mk,将里面的nawk全部改为awk,可以使用这个命令 :%s/nawk/awk/g 

       4、make

       5、将/home/user/apue.2e/include/apue.h和/home/user/apue.2e/lib/error.c复制到/usr/include目录下


    二,要拷贝的apue.h和error.c文件如下:(可以直接复制并拷贝到/usr/include下)

    apue.h (添加了一行 #include <error.c>)

    /* Our own header, to be included before all standard system headers */
    
    #ifndef	_APUE_H
    #define	_APUE_H
    
    #if defined(SOLARIS)
    #define _XOPEN_SOURCE	500	/* Single UNIX Specification, Version 2  for Solaris 9 */
    #define CMSG_LEN(x)	_CMSG_DATA_ALIGN(sizeof(struct cmsghdr)+(x))
    #elif !defined(BSD)
    #define _XOPEN_SOURCE	600	/* Single UNIX Specification, Version 3 */
    #endif
    
    #include <sys/types.h>		/* some systems still require this */
    #include <sys/stat.h>
    #include <sys/termios.h>	/* for winsize */
    #ifndef 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 */
    
    #if	defined(SIG_IGN) && !defined(SIG_ERR)
    #define	SIG_ERR	((Sigfunc *)-1)
    #endif
    
    #define	min(a,b)	((a) < (b) ? (a) : (b))
    #define	max(a,b)	((a) > (b) ? (a) : (b))
    
    /*
     * Prototypes for our own functions.
     */
    char	*path_alloc(int *);				/* {Prog pathalloc} */
    long	 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 <termios.h> 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_writen} */
    ssize_t	 writen(int, const void *, size_t);	/* {Prog readn_writen} */
    void	 daemonize(const char *);			/* {Prog daemoninit} */
    
    int		 s_pipe(int *);					/* {Progs streams_spipe sock_spipe} */
    int		 recv_fd(int, ssize_t (*func)(int,
    		         const void *, size_t));/* {Progs recvfd_streams recvfd_sockets} */
    int		 send_fd(int, int);				/* {Progs sendfd_streams sendfd_sockets} */
    int		 send_err(int, int,
    		          const char *);		/* {Prog senderr} */
    int		 serv_listen(const char *);		/* {Progs servlisten_streams servlisten_sockets} */
    int		 serv_accept(int, uid_t *);		/* {Progs servaccept_streams servaccept_sockets} */
    int		 cli_conn(const char *);		/* {Progs cliconn_streams cliconn_sockets} */
    int		 buf_args(char *, int (*func)(int,
    		          char **));			/* {Prog bufargs} */
    
    int		 ptym_open(char *, int);	/* {Progs3 ptyopen_streams ptyopen_bsd ptyopen_linux} */
    int		 ptys_open(char *);			/* {Progs3 ptyopen_streams ptyopen_bsd ptyopen_linux} */
    #ifdef	TIOCGWINSZ
    pid_t	 pty_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_dump(const char *, ...);		/* {App misc_source} */
    void	err_msg(const char *, ...);
    void	err_quit(const char *, ...);
    void	err_exit(int, 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_conditions} */
    void	TELL_PARENT(pid_t);
    void	TELL_CHILD(pid_t);
    void	WAIT_PARENT(void);
    void	WAIT_CHILD(void);
    
    #include "error.c" 
    #endif	/* _APUE_H */

    error.c

    #include "apue.h"
    #include <errno.h>		/* for definition of errno */
    #include <stdarg.h>		/* ISO C variable aruments */
    
    static void	err_doit(int, int, const char *, va_list);
    
    /*
     * Nonfatal error related to a system call.
     * Print a message and return.
     */
    void
    err_ret(const char *fmt, ...)
    {
    	va_list		ap;
    
    	va_start(ap, fmt);
    	err_doit(1, errno, fmt, ap);
    	va_end(ap);
    }
    
    /*
     * Fatal error related to a system call.
     * Print a message and terminate.
     */
    void
    err_sys(const char *fmt, ...)
    {
    	va_list		ap;
    
    	va_start(ap, fmt);
    	err_doit(1, errno, fmt, ap);
    	va_end(ap);
    	exit(1);
    }
    
    /*
     * Fatal error unrelated to a system call.
     * Error code passed as explict parameter.
     * Print a message and terminate.
     */
    void
    err_exit(int error, const char *fmt, ...)
    {
    	va_list		ap;
    
    	va_start(ap, fmt);
    	err_doit(1, error, fmt, ap);
    	va_end(ap);
    	exit(1);
    }
    
    /*
     * Fatal error related to a system call.
     * Print a message, dump core, and terminate.
     */
    void
    err_dump(const char *fmt, ...)
    {
    	va_list		ap;
    
    	va_start(ap, fmt);
    	err_doit(1, errno, fmt, ap);
    	va_end(ap);
    	abort();		/* dump core and terminate */
    	exit(1);		/* shouldn't get here */
    }
    
    /*
     * Nonfatal error unrelated to a system call.
     * Print a message and return.
     */
    void
    err_msg(const char *fmt, ...)
    {
    	va_list		ap;
    
    	va_start(ap, fmt);
    	err_doit(0, 0, fmt, ap);
    	va_end(ap);
    }
    
    /*
     * Fatal error unrelated to a system call.
     * Print a message and terminate.
     */
    void
    err_quit(const char *fmt, ...)
    {
    	va_list		ap;
    
    	va_start(ap, fmt);
    	err_doit(0, 0, fmt, ap);
    	va_end(ap);
    	exit(1);
    }
    
    /*
     * Print a message and return to caller.
     * Caller specifies "errnoflag".
     */
    static void
    err_doit(int errnoflag, int error, const char *fmt, va_list ap)
    {
    	char	buf[MAXLINE];
    
    	vsnprintf(buf, MAXLINE, fmt, ap);
    	if (errnoflag)
    		snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",
    		  strerror(error));
    	strcat(buf, "\n");
    	fflush(stdout);		/* in case stdout and stderr are the same */
    	fputs(buf, stderr);
    	fflush(NULL);		/* flushes all stdio output streams */
    }

    三,示例:


    #include <stdio.h>
    #include <dirent.h>
    
    int main(int argc, char *argv[])
    {
        DIR        *dp;
        struct dirent    *dirp;
        if(argc!=2)
        {
            printf("Usage: ls directory_name\n");
            return -1;
        }
        if((dp=opendir(argv[1]))==NULL)
            printf("can't open %s\n", argv[1]);
        while((dirp = readdir(dp))!=NULL)
            printf("%s\n", dirp->d_name);
    
        closedir(dp);
        return 0;
    }


  • 相关阅读:
    hdu 5224 Tom and paper 水题
    2015 UESTC 搜索专题N题 韩爷的梦 hash
    2015 UESTC 搜索专题M题 Palindromic String 马拉车算法
    2015 UESTC 搜索专题K题 秋实大哥の恋爱物语 kmp
    2015 UESTC 搜索专题J题 全都是秋实大哥 kmp
    2015 UESTC 搜索专题F题 Eight Puzzle 爆搜
    2015 UESTC 搜索专题E题 吴队长征婚 爆搜
    2015 UESTC 搜索专题D题 基爷的中位数 二分
    2015 UESTC 搜索专题C题 基爷与加法等式 爆搜DFS
    2015 UESTC 搜索专题B题 邱老师降临小行星 记忆化搜索
  • 原文地址:https://www.cnblogs.com/secbook/p/2654985.html
Copyright © 2011-2022 走看看