APUE 8-1 fork函数实例
来源:互联网 发布:软件的健壮性 编辑:程序博客网 时间:2024/05/17 19:20
apue.h
my_err.h
8-1.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 */}
8-1.c
#include "apue.h"#include "my_err.h"int globvar = 6;char buf[] = "a write to stdout\n";int main(){int var;pid_t pid;var = 88;if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)err_sys("write error");printf("before fork\n");if ((pid = fork()) < 0) {err_sys("fork error");} else if (pid == 0) {globvar++;var++;} else {sleep(2);}printf("pid = %ld, glob = %d, var = %d\n", (long)getpid(), globvar, var);exit(0);}
0 0
- APUE 8-1 fork函数实例
- 【APUE学习心得】fork函数
- 【APUE】5、fork函数
- APUE-8.3节fork函数实例,printf输出两次问题
- fork函数实例
- fork函数实例
- linux fork() 函数实例详解
- linux fork() 函数实例详解
- APUE 8.3 fork function
- [APUE] 线程和fork
- APUE--fork与vfork
- APUE(一)FORK机制
- apue 8-5调用fork两次以避免僵死进程
- Linux中fork()函数实例讲解
- linux中fork()函数实例详解
- linux中fork()函数实例详解
- Linux中fork()函数实例分析
- fork函数(1)
- ubuntu14.04系统相关
- Spark 源码解析 : DAGScheduler中的DAG划分与提交
- 转义字符
- UIProgressView 进度表
- IO
- APUE 8-1 fork函数实例
- 【嵌入式学习日记】2016年7月19日
- CC2540协议栈下开发流程
- linux vim 删除命令记录
- Spring整合Redis数据库(maven项目)
- 41 和为 s 的两个数字
- Java 内存分配全面浅析
- 遭受ARP攻击后现象
- A+B问题(c,c#,java实现)