APUE 2-16 为路径名动态的分配存储空间
来源:互联网 发布:修改用户权限 linux 编辑:程序博客网 时间:2024/04/28 12:24
apue.h
my_err.h
2-16.c
/* * Our own header, to be included before all standard system headers. */#ifndef_APUE_H#define_APUE_H#define _POSIX_C_SOURCE 200809L#if defined(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 */#if defined(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 */#defineMAXLINE4096/* max line length *//* * Default file access permissions for new files. */#defineFILE_MODE(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)/* * Default permissions for new directories. */#defineDIR_MODE(FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)typedefvoidSigfunc(int);/* for signal handlers */#definemin(a,b)((a) < (b) ? (a) : (b))#definemax(a,b)((a) > (b) ? (a) : (b))/* * Prototypes for our own functions. */char*path_alloc(size_t *);/* {Prog pathalloc} */long open_max(void);/* {Prog openmax} */int set_cloexec(int);/* {Prog setfd} */void clr_fl(int, int);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} */void daemonize(const char *);/* {Prog daemoninit} */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} */int fd_pipe(int *);/* {Prog sock_fdpipe} */int recv_fd(int, ssize_t (*func)(int, const void *, size_t));/* {Prog recvfd_sockets} */int send_fd(int, int);/* {Prog sendfd_sockets} */int send_err(int, int, const char *);/* {Prog senderr} */int serv_listen(const char *);/* {Prog servlisten_sockets} */int serv_accept(int, uid_t *);/* {Prog servaccept_sockets} */int cli_conn(const char *);/* {Prog cliconn_sockets} */int buf_args(char *, int (*func)(int, char **));/* {Prog bufargs} */int tty_cbreak(int);/* {Prog raw} */int tty_raw(int);/* {Prog raw} */int tty_reset(int);/* {Prog raw} */void tty_atexit(void);/* {Prog raw} */struct termios*tty_termios(void);/* {Prog raw} */int ptym_open(char *, int);/* {Prog ptyopen} */int ptys_open(char *);/* {Prog ptyopen} */#ifdefTIOCGWINSZpid_t pty_fork(int *, char *, int, const struct termios *, const struct winsize *);/* {Prog ptyfork} */#endifintlock_reg(int, int, int, off_t, int, off_t); /* {Prog lockreg} */#defineread_lock(fd, offset, whence, len) \lock_reg((fd), F_SETLK, F_RDLCK, (offset), (whence), (len))#definereadw_lock(fd, offset, whence, len) \lock_reg((fd), F_SETLKW, F_RDLCK, (offset), (whence), (len))#definewrite_lock(fd, offset, whence, len) \lock_reg((fd), F_SETLK, F_WRLCK, (offset), (whence), (len))#definewritew_lock(fd, offset, whence, len) \lock_reg((fd), F_SETLKW, F_WRLCK, (offset), (whence), (len))#defineun_lock(fd, offset, whence, len) \lock_reg((fd), F_SETLK, F_UNLCK, (offset), (whence), (len))pid_tlock_test(int, int, off_t, int, off_t);/* {Prog locktest} */#defineis_read_lockable(fd, offset, whence, len) \(lock_test((fd), F_RDLCK, (offset), (whence), (len)) == 0)#defineis_write_lockable(fd, offset, whence, len) \(lock_test((fd), F_WRLCK, (offset), (whence), (len)) == 0)voiderr_msg(const char *, ...);/* {App misc_source} */voiderr_dump(const char *, ...) __attribute__((noreturn));voiderr_quit(const char *, ...) __attribute__((noreturn));voiderr_cont(int, const char *, ...);voiderr_exit(int, const char *, ...) __attribute__((noreturn));voiderr_ret(const char *, ...);voiderr_sys(const char *, ...) __attribute__((noreturn));voidlog_msg(const char *, ...);/* {App misc_source} */voidlog_open(const char *, int, int);voidlog_quit(const char *, ...) __attribute__((noreturn));voidlog_ret(const char *, ...);voidlog_sys(const char *, ...) __attribute__((noreturn));voidlog_exit(int, const char *, ...) __attribute__((noreturn));voidTELL_WAIT(void);/* parent/child from {Sec race_conditions} */voidTELL_PARENT(pid_t);voidTELL_CHILD(pid_t);voidWAIT_PARENT(void);voidWAIT_CHILD(void);#endif/* _APUE_H */
my_err.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. */voiderr_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. */voiderr_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. */voiderr_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. */voiderr_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. */voiderr_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. */voiderr_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 voiderr_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 */}
2-16.c
#include "apue.h"#include "my_err.h"#include <errno.h>#include <limits.h>#ifdef PATH_MAXstatic long pathmax = PATH_MAX;#elsestatic long pathmax = 0;#endifstatic long posix_version = 0;static long xsi_version = 0;#define PATH_GUESS 1024char * path_alloc(size_t *sizep){char *ptr;size_t size;if (posix_version == 0)posix_version = sysconf(_SC_VERSION);if (xsi_version == 0)xsi_version = sysconf(_SC_XOPEN_VERSION);if (pathmax == 0) {errno = 0;if ((pathmax = pathconf("/", _PC_PATH_MAX)) < 0) {if (errno == 0)pathmax = PATH_MAX_GUESS;else err_sys("pathconf error for _PC_PATH_MAX");} else {pathmax++;}}if ((posix_version < 200222L) && (xsi_version < 4))size = pathmax + 1;elsesize = pathmax;if ((ptr = malloc(size)) == NULL)err_sys("malloc error for pathname");if (sizep != NULL)*sizep = size;return(ptr);}
0 0
- APUE 2-16 为路径名动态的分配存储空间
- 为路径动态的分配空间
- 动态存储空间分配
- 连续的存储空间分配(2.2.2)
- DSP的存储空间分配
- 6410的存储空间分配
- C++_动态存储空间的分配和释放
- C++_动态存储空间的分配和释放
- C++_动态存储空间的分配和释放
- 为结构体分配额外存储空间的方法
- ICCAVR 中存储空间的分配
- C程序的存储空间分配
- 存储空间的分配和释放
- C++ 动态存储空间的分配和释放 new与malloc的区别
- C++ 动态存储空间的分配和释放 new与malloc的区别
- 使用计算总内存大小的方法确定jvm中为对象分配的存储空间大小
- C++防灾——为指针成员分配专门的存储空间
- C++防灾——为指针成员分配专门的存储空间
- 碎片的使用方式
- MapReduce基础开发之九JDBC连接Hive
- Error Domain=com.alamofire.error.serialization.response Code=-1016 "
- Centos7 下 Hadoop 2.6.4 分布式集群环境搭建
- BZOJ2844 albus就是要第一个出场
- APUE 2-16 为路径名动态的分配存储空间
- tomcat 与 weblogic 区别
- python学习——HTTP协议简介
- &&和&
- hashmap,hashtable与currenthashmap
- js中的defer关键字
- 13. Roman to Integer
- discuz发贴后并未在版块主题列表中显示出来的问题
- java为什么要实例化?实例化的对象和引用...