apue

编译unix环境高级编程第一个例子出错解决

天涯浪子 提交于 2019-12-09 20:49:23
unix环境高级编程第一个例子ls.c: #include "apue.h" #include <dirent.h> int main(int argc,char *argv[]) { DIR *dp; struct dirent *dirp; if(argc != 2) err_quit("usage: ls directory_name"); if((dp = opendir(argv[1])) == NULL) err_sys("can't open %s", argv[1]); while((dirp = readdir(dp))!=NULL) printf("%s\n",dirp->d_name); closedir(dp); exit(0); } 编译出错: [john@localhost apue]$ gcc ls.c /tmp/cchIn3xL.o: In function `main': ls.c:(.text+0x17): undefined reference to `err_quit' ls.c:(.text+0x4a): undefined reference to `err_sys' 发现是找不到err_quit和err_sys,于是把unix环境高级编程源码的lib目录下的error.c拷贝出来和一起编译: [john@localhost apue]$

APUE: Standard I/O Library

柔情痞子 提交于 2019-12-09 20:14:44
流和FIFE对象 标准I/O文件流可以处理单字节和宽字节. 函数fwide用于设置流的方向: #include <stdio.h> #include <wchar.h> int fwide(FILE *fp, int mode); returns: 宽字节流则返回正数, 单字节流则返回负数, 没有则返回0. 如果mode为负数, 则函数尝试将流设置为单字节. 如果mode为正数, 则函数尝试将流设置为宽字节. 如果mode为0, 则保持原样. 当我们使用 fopen 打开一个流时, 它将返回一个指针指向 FILE 对象. 此对象包含了流的全部信息: 文件描述符, 指针指向一个存储流的Buffer, Buffer的大小, 已读取流的大小, 错误标志等等. 缓冲(Buffering) 标准I/O提供三种类型的缓冲: 1. 全缓冲: 在填满标准I/O缓冲区后才进行实际I/O操作. 2. 行缓冲: 输入和输出遇到换行符时候, 标准I/O执行I/O操作. 3. 不带缓冲. 通常, 系统默认是: 1. 标准错误是不带缓冲的. 2. 如若是涉及终端设备的其他流,则它们是行缓冲的;否则是全缓冲的。 通过函数setbuf来改变流的模式: #include <stdio.h> void setbuf(FILE *restrict fp, char *restrict buf); int setvbuf

OS X下UNIX环境高级编程(第三版)学习日志-第一章ChapterI,编译apue包与第一个例程

拜拜、爱过 提交于 2019-12-09 20:13:19
1.从网络上获取代码,地址如下 apue最新官方下载地址 2.解压到本地 由于最新版本是第三版(3rd Edition),apue.3e,就是我们要的源代码 3.编译源代码 编译过程中笔者并未遇到任何问题,所以建议大家也下载最新版本的代码来学习,贴一下笔者的环境信息 Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) Target: x86_64-apple-darwin14.5.0 Thread model: posix 3.1 没有安装xcode,只安装了os x命令行开发工具,os x用户可以在这里下载 官方最新最全版本的xcode及命令行开发工具 (xcode ghost出了之后只信任官方haha),笔者安装的是适用于os x10.10的版本,目前稳定版的xcode是6.4所以就选6.4版本,读者可自行选择。 最新版本的gcc(5.2.0)在编译的时候会有不支持-R命令的问题,因此就选用了自带的4.2.1(好像是吼),读者如果用的也是不支持-R命令的问题

OS X下UNIX环境高级编程(第三版)学习日志-第一章ChapterI,输入和输出

≡放荡痞女 提交于 2019-12-09 19:58:50
文件描述符 通常是一个小的非负整数,也就是说0,1等 标准输入,标准输出和标准错误 standard input,standard output,standard error,在不做特殊处理的情况下,3个描述符都链接到终端,也就是说,我们用终端输入,输出和输出错误,使用 < >符号来重定向输入源和输出目的。 不带缓冲的I/O 函数open,read,write,lseek以及close提供了不带缓冲的I/O,这些函数都使用文件描述符。 #include "apue.h" #define BUFFSIZE 4096 int main(void){ int n; char buf[BUFFSIZE]; while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0) if(write(STDOUT_FILENO,buf,n)!=n) err_sys("write error"); if(n<0) err_sys("read error"); exit(0); } 以上是一个复制文件的程序实例。 重点代码(4.1 仅笔者自己理解,不作为读者参考 ): 4.1 n=read(STDIN_FILENO,buf,BUFFSIZE) STDIN_FILENO:是一个常量,POSIX标准的一部分,在unistd.h中定义,实际值为0

APUE: Process Environment

感情迁移 提交于 2019-12-05 19:39:36
main函数和进程终止 当内核执行C程序时,在调用main前先调用一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地址。启动例程从内核取得命令行参数和环境变量值,然后调用main函数。 存在8种方式终止进程: 5种正常终止: 1. 从main返回 2. 调用exit 3. 调用_exit或者_Exit 4. 最后一个线程从启动例程中返回. 5. 最后一个线程调用pthread_exit. 3种异常终止: 1. 调用abort 2. 接收信号并终止. 3. 最后一个线程对取消请求做出响应. Exit函数 #include <stdlib.h> void exit(int status); void _Exit(int status); #include <unistd.h> void _exit(int status); _exit和_Exit会立马返回到内核, 而exit则会清除线程后返回内核. 在main函数中, 如果没有显式return/exit, 则默认返回0: #include <stdio.h> int main(void) { printf("hello world\n"); } 终端输出: leicj@leicj:~/test$ ./a.out hello world leicj@leicj:~/test$ echo $? 0 atexit函数