unix环境高级编程

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

∥☆過路亽.° 提交于 2019-12-09 20:13:45
1.errno POSIX和ISO C将errno定义为一个符号,它扩展称为一个可修改的整型左值(lvalue)。它可以使一个包含出错编号的证书,也可以是一个返回出错编号指针的函数。 在支持线程的环境中,多个线程共享进程地址空间,为避免一个线程干扰另一个线程,例如Linux支持多线程存取errno,将其定义为: extern int *__errno_location(void); #define errno (*__errno_location) 2. c标准定义了两个函数,用于打印出错信息。 #include <string.h> char *strerror(int errnum); strerror函数将errnum映射为一个出错消息字符串,并且返回此字符串的指针. #include <stdio.h> void perror(const char *msg); 它首先输出由msg指向的字符串,然后是一个冒号,一个空格,接着是对应于errno值的出错信息,最后是一个换行符。 3.实例 #include "apue.h" #include <errno.h> int main(int argc,char *argv[]){ fprintf(stderr,"EACCES:%s\n",strerror(EACCES)); errno=ENOENT; perror(argv[0])

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

≡放荡痞女 提交于 2019-12-09 20:13:32
程序和进程 程序是一个可执行文件,进程是程序的执行实例,unix系统中,每个进程都有一个唯一的数字标识符,被称为进程ID。 #include "apue.h" int main(void){ printf("hello world form process ID %ld\n",(long)getpid()); exit(0); } 重点:%ld表示打印长整型 getpid()函数,返回自身的进程id,返回值类型为pid_t,如果要输出,可以(long)强转成长整型,使用长整型可以提高可移植性,推测:防止某个运行环境整型过短的情况发生。 进程控制 有3个用于进程控制的主要函数:fork,exec,waitpid。 #include "apue.h" int main(void){ char buf[MAXLINE]; pid_t pid; int status; printf("%% "); while(fgets(buf,MAXLINE,stdin)!=NULL){ if(buf[strlen(buf)-1]=='\n') buf[strlen(buf)-1]=0;//replace the last char with null if((pid=fork())<0){ err_sys("fork error"); }else if(pid==0){ /*child*/

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