APUE 3-11 对于指定的描述符打印文件标志
来源:互联网 发布:python安装第三方模块 编辑:程序博客网 时间:2024/06/08 00:28
apue.h
my_err.h
3-11.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 */}
3-11.c
#include "apue.h"#include "my_err.h"#include <fcntl.h>int main(int argc, char *argv[]){int val;if (argc != 2)err_quit("usage: a.out <descriptor#>");if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0)err_sys("fcntl error for fd %d", atoi(argv[1]));switch (val & O_ACCMODE) {case O_RDONLY:printf("read only");break;case O_WRONLY:printf("erite only");break;case O_RDWR:printf("read write");break;deafault:err_dump("unknown access mode");}if (val & O_APPEND)printf(", append");if (val & O_NONBLOCK)printf(", noblock");if (val & O_SYNC)printf(", synchronous writes");#if !defined(_POSIX_C_SOURCE) && defined(O_FSYNC) && (O_FSYNC != O_SYNC)if (val & O_FSYNC)printf(", synchronous writes");#endifputchar('\n');exit(0);}
0 0
- APUE-3.4 对于指定的描述符打印文件标志
- APUE 3-11 对于指定的描述符打印文件标志
- 对于指定的描述符打印文件标志
- APUE-用fcntl函数对指定的描述符打印和开启文件标志
- 《Unix环境高级编程》:打印指定的描述符的文件标志
- 文件描述符标志
- 文件描述符的FD_CLOEXEC标志
- APUE(3) ---- 文件描述符(1)
- 文件描述符,文件描述符标志,文件状态标志 三个的区别和联系
- 文件描述符 文件描述标志 文件状态标志
- 文件描述符 文件描述标志 文件状态标志
- 关于文件描述符的close-on-exec标志位
- 文件描述符标志和文件状态标志区别
- 文件描述符标志和文件状态标志区别
- 文件描述符与文件描述符标志
- 文件描述符、文件描述标志位、文件状态标志 区别
- UNIX/Linux中的文件按描述符标志或文件状态标志的修改,即 “与或非” 操作
- 实现小程序:返回给定文件描述符的文件标志说明
- #500-1 类和对象
- 专访|HPE软件部中国区总经理李时:HPE引领IT战略新形态
- 内联函数
- Java中String类的一些用法 和含义
- python中yield的作用
- APUE 3-11 对于指定的描述符打印文件标志
- ROS学习之 cpp名字和节点信息
- 杭电1004
- 【POJ】2369 - Permutations(置换群)
- 由拉钩app引起的故事
- Android中SQLite应用详解
- 欢迎使用CSDN-markdown编辑器
- R下安装配置RStudio
- 实习见闻(1)——第一天