博客地址 : http://blog.csdn.net/shulianghan/article/details/46980271
1、解压至/home/user/目录下 2、修改 Make.defines.linux中的WKDIR=/home/xxx/apue.2e,为WKDIR=/home/user/apue.2e ...3、然后再进入apue.2e目录下的std目录,打开linux.mk,将里面的nawk全部替换为awk,可以使用这个命令 :%s/nawk/awk/g 4、把 /home/limeng/apue...5、把 /home/limeng/apue.2e/lib目录下的 error.c 文件第一行 #include "apue.h"注释掉或者删除,也将该文件拷贝到/usr/include 目录中。 ...然后就可以方便的使用apue.h编译《unix高级环境编程》的的程序了。...apue.h内容如下: 1 #ifndef _APUE_H 2 #define _APUE_H 3 4 #define _XOPEN_SOURCE
在UNIX环境高级编程(APUE)中提到了守护进程的创建方法,思路很清晰,所以这里通过代码具体研究下。 1 完整程序:单实例守护进程 根据APUE的介绍,创建守护进程基本需要如下7个步骤。...apuesingledaemonprocess.html * @Compile gcc daemon_process.c -o daemon_process * @Reference program list 13-1 in APUE
看来有的人还是对schema的真正含义不太理解,如今我再次整理了一下,希望对大家有所帮助。
apue 最后两章都是通过一个完整的实例来解释一些 linux 功能,第20章就是通过一个数据库实例来解释文件锁的使用, 说实话,当时没兴趣,因为满页都是源码和解析,有点看不下去。...先来看看这个数据库提供的 SDK 接口: apue_db.h 1 #ifndef __APUE_DB_H__ 2 #define __APUE_DB_H__ 3 4 typedef void*.../db_nextrec 用来无序遍历数据库中的所有key db_dump 是我自己加的一个接口,用来打印数据库内部状态,如索引哈希表、索引空闲节点列表,调试时使用 实现比较长,就不贴了,只给一个链接:apue_db.c...依据书中代码,纯手工输入,同时加入了习题中可以指定索引哈希表大小的能力 (编译时指定 HAS_HASHSIZE 宏,运行时通过环境变量 APUE_DB_HASH_SIZE 指定具体的哈希值,当然这个只在创建数据库时起作用.../apue.h" 2 #include "apue_db.h" 3 #include 4 #include 5 #include <errno.h
1 常用函数 #include "apue_db.h" //打开数据库 DBHANDLE db_open(const char *pathname, int oflag, ... /* int mode...//通过提供key可以取记录 #include "apue_db.h" char *db_fetch(DBHANDLE db, const char *key); Returns...: pointer to data if OK, NULL if record not found //通过提供key可以删除记录 #include "apue_db.h" int db_delete...Create a database and write three records to it #include "apue.h" #include "apue_db.h" #include <fcntl.h
/apue.h 7 gcc -Wall -g -c $< -o $@ 8 9 print_iflag.o: print_iflag.c ...../apue.h 10 gcc -Wall -g -c $< -o $@ 11 12 print_iflag.c: print_flag.awk iflag.sym 13 ..../apue.h 16 gcc -Wall -g -c $< -o $@ 17 18 print_oflag.c: print_flag.awk oflag.sym 19 ..../apue.h 22 gcc -Wall -g -c $< -o $@ 23 24 print_cflag.c: print_flag.awk cflag.sym 25 ..../log.h 40 gcc -Wall -g -c $< -o $@ 41 42 apue.o: ../apue.c ..
/apue/04.chapter/tmp/B cd to /home/yunh/code/apue/04.chapter/tmp/A cd to /home/yunh/code/apue/04.chapter.../apue/04.chapter/tmp/A cd to /home/yunh/code/apue/04.chapter/tmp/B cd to /home/yunh/code/apue/04.chapter.../apue/04.chapter/tmp/B cd to /home/yunh/code/apue/04.chapter/tmp/A cd to /home/yunh/code/apue/04.chapter.../apue/04.chapter/tmp/A cd to /home/yunh/code/apue/04.chapter/tmp/B cd to /home/yunh/code/apue/04.chapter.../apue/04.chapter/tmp/B cd to /home/yunh/code/apue/04.chapter/tmp/A cd to /home/yunh/code/apue/04.chapter
List all the files in a directory #include "apue.h" #include int main(int argc, char *argv...List all the files in a directory #include "apue.h" #define BUFFSIZE 4096 int main(void) { int...After the last byte of input has been read, getc returns the constant EOF (defined in #include "apue.h...Print the process ID #include "apue.h" int main(void) { printf("hello world from process ID %d\n"...) { char buf[MAXLINE]; /* from apue.h */ pid_t pid; int status; printf("%
From github.com:goodpaperman/apue 86b80d3..e0cc835 master -> origin/master Updating 386fd43.....To git@github.com:goodpaperman/apue.git 87748c7..08e3a1e master -> master 已经是最新时: $ git push Everything...Fast-forward apue.c | 11 +++++------ 1 files changed, 5 insertions(+), 6 deletions(-) start pulling...To git@github.com:goodpaperman/apue.git 8560ad0..0d3c3c7 master -> master start pushing git 1 spawn...与终端相关的内容,可以参考我之前写的这篇文章:[apue] 书中关于伪终端的一个纰漏 参考 [1].
实际上这又是一个典型的“ 我以为我读懂了apue但实际上并没有 ”基础问题。上一次遇到这种问题还是老李大战file_put_content的时候,这篇文章链接我会加到末尾。...真正完整的内容参考APUE第91页至95页,大概是这样shai儿的: ?...补充下上次感受到「APUE满满恶意」时候的那篇文章: 老李大战PHP之file_put_contents 我每次觉得自己读懂APUE的时候,他总是会肆无忌惮在任意时间和地点狠狠地打我一次脸。...「如果你觉得你已经读懂了APUE,那你一定是读错了」
示例: #include "apue.h" Int main(int argc, char *argv[]) { int i; struct stat buf;...write permission X_OK test for execute permission F_OK test for existence of file 示例 #include "apue.h... mode_t umask(mode_t cmask); Returns: previous file mode creation mask 示例 #include "apue.h...为了做到这一点,先用stat获取文件当前状态(包括时间),然后截短,最后用utime复位 #include "apue.h" #include #include ...这就意味着下面这段代码不会产生我们希望的结果 #include "apue.h" int main(void) { if (chdir("/tmp") < 0) err_sys
/myfind / -comp apue.h 输出在目录子树之下,所有与文件内容一致的文件的绝对路径名。 ?...可能会很奇怪,因为根目录下每个用户(学生)都应该配了apue开发环境,但是为啥就我一个和另外一个14级的学生呢,其实也正常,因为我只是一个普通用户,访问不了其他用户的目录文件。.../myfind / -name apue.h apue.2e string.h ?.../myfind / -comp apue.h 输出来看,程序成功比较了根目录下能成功打开的文件内容,输出了与用户提供的文件内容一致的文件绝对路径 从调用多(>=4)参数模式 ..../myfind / -name apue.h apue.2e string.h 输出来看,程序可以找出同个目录下的多个相同文件名的文件,对输入多文件名也支持 4.实验收获暨总结 一开始对课本上的一百多行的递归遍历文件目录的代码整懵了
父子进程调用顺序不确定 #include "apue.h" int glob = 6; /* external variable in initialized data */ char...3 vfork函数 #include "apue.h" int glob = 6; /* external variable in initialized data */ Int main...#include "apue.h" #include Int main(void) { pid_t pid; int status; if...调用fork两次来避免僵死进程 #include "apue.h" #include Int main(void) { pid_t pid; if ((pid...#include "apue.h" #include char *env_init[] = { "USER=unknown", "PATH=/tmp", NULL };
只可以发信号给某个进程,而不能是进程组 return 0; } 测试如下: 先运行recv程序: simba@ubuntu:~/Documents/code/linux_programming/APUE.../sigqueue_recv 再ps出recv进程的pid,然后运行send程序: simba@ubuntu:~/Documents/code/linux_programming/APUE/signal... kill(pid, SIGUSR1); return 0; } 先是运行recv程序: simba@ubuntu:~/Documents/code/linux_programming/APUE.../sigrtime_recv2 接着ps出recv进程的pid,运行send程序: simba@ubuntu:~/Documents/code/linux_programming/APUE/signal...参考:《APUE》
ERR_EXIT("fcntl set flag error"); } 测试输出: simba@ubuntu:~/Documents/code/linux_programming/APUE... return 0; //进程退出会对所有文件解锁 } 测试如下: 我们先在一个 终端执行程序: simba@ubuntu:~/Documents/code/linux_programming/APUE...现在文件已经被锁住了,而且没有按下任何按键,所以卡在这里,也还没解锁,接着在另一个终端再次执行同个程序: simba@ubuntu:~/Documents/code/linux_programming/APUE...参考:《APUE》
write(fd, "child", 5); } return 0; } 测试输出如下: simba@ubuntu:~/Documents/code/linux_programming/APUE...2573 this is child child pid=2573 parent pid=2572 simba@ubuntu:~/Documents/code/linux_programming/APUE.../process$ cat test.txt parentchild simba@ubuntu:~/Documents/code/linux_programming/APUE/process$ ...参考:《APUE》
if OK, SIG_ERR on error func的值可以是: (1)SIG_IGN–忽略 (2)SIG_DFL–系统默认动作 (3)调用的函数地址–信号处理程序 #include "apue.h...#include int sigpending(sigset_t *set); Returns: 0 if OK, 1 on error #include "apue.h...sigpending(sigset_t *set); Returns: 0 if OK, 1 on error 实例一:保护临界区,使其不被特定的信号中断的正确方法 #include "apue.h...实例二:等待一个信号处理程序设置一个全局变量 #include "apue.h" volatile sig_atomic_t quitflag; /* set nonzero by signal...oldmask, NULL) < 0) err_sys("SIG_SETMASK error"); exit(0); } 9 sleep函数的有效实现 #include "apue.h
程序中注册信号在fork之前,故子进程也会继承,在子进程中对进程组发送了信号,故信号处理函数会被调用两次: simba@ubuntu:~/Documents/code/linux_programming/APUE.../kill recv a sig=10 recv a sig=10 simba@ubuntu:~/Documents/code/linux_programming/APUE/signal$ ...n", sig); alarm(1); // 间接递归调用handler } 输出测试: simba@ubuntu:~/Documents/code/linux_programming/APUE...而如上程序所示的话,输出为simba@ubuntu:~/Documents/code/linux_programming/APUE/signal$ ....参考:《APUE》
/apue.h" void do_dirty_work () { printf ("doing dirty works!.../apue.h" void do_dirty_work () { printf ("doing dirty works!.../apue.h gcc -Wall -g -c $< -o $@ -std=c99 jumpvar_opt: jumpvar_opt.o apue.o gcc -Wall -g $^ -o.../apue.h gcc -Wall -g -c $< -o $@ -std=c99 -O ... 再次运行: $ ...."/home/users/yunhai01/code/apue/07.chapter/.
领取专属 10元无门槛券
手把手带您无忧上云