《Linux/Unix系统编程手册》读书笔记1


《Linux/Unix系统编程手册》读书笔记 目录

最近这一个月在看《Linux/Unix系统编程手册》,在学习关于Linux的系统编程。之前学习Linux的时候就打算写关于Linux的学习记录,因为觉得自己学得不好,老是写不出东西。但是现在觉得学习记录应该坚持写,慢慢就会有收获,坚持写才可以锻炼自己的表达能力。

《Linux/Unix系统编程手册》这本书的评价很高,但是个人觉得翻译得不太好。其实终究是因为自己的英文阅读能力太差和没什么钱,只能看翻译版。看了接近一个月,觉得这本书介绍的接口很详细,程序清单基本会提及到介绍的接口。个人觉得作为入门书应该是可以的,起码看完一遍会有初步的认识,而且作为参考手册也不错。打算看完这本书之后,继续学习《UNIX环境高级编程》,学无止境。

第1章:

介绍了一些历史,关于Linux、Unix和C;还有一些标准POSIX、SUS 

第2章:

介绍Linux和Unix的一些基本概念。

1.操作系统的两个含义:一,包含管理和分配计算机资源的核心层软件和附带的所有标准软件;二,仅仅指管理和分配计算机资源的核心层软件。

2.内核的作用:进程调度、内存管理、文件系统、创建和终止进程、对设备的访问、联网、提供API。其实就是抽象,用户通过内核来使用硬件,而不用直接与硬件打交道。

3.用户态和内核态。

。。。。。。。。。。。。。。。。还有一堆的概念。。。。。。。。。。。。。。。。。。。

第3章

介绍系统编程的概念。

系统调用(systerm calls)是用户程序与操作系统之间的接口,系统调用在内核态。库函数(library functions),一些库函数是通过系统调用来实现,好处是提供了比底层系统调用更方便的接口。

还有本书的代码所需的一些函数、头文件。。。。。。。。。。。

见链接:http://www.man7.org/tlpi/

第4章

介绍了文件I/O。

文件描述符,用来表示已经打开的文件(所有类型),是一非负整数。最基本的文件描述符0(标准输入)、1(标准输出)、2(标准错误)。

I/O操作:首先通过调用open获取一个文件描述符,再对该文件描述符进行read或者write操作,最后使用close释放文件描述符和相关资源。

 

 #include <sys/stat.h>
 #include <fcntl.h>
 
  open(  *pathname,  flags, ...);

成功调用返回文件描述符,失败返回-1;

1、pathname为打开文件的文件名; flags为位掩码,用于指定文件的访问模式;mode为位掩码参数,用于指定文件的访问权限(可选)。

2、flags位掩码的标志分为文件访问模式标志、文件创建标志、已打开文件的状态标志;其中文件访问模式标志如下表,这些标志不能同时使用。

访问模式 描述
 O_RDONLY 以只读方式打开文件 
O_WRONLY 以只写方式打开文件
O_RDWR 以读写方式打开文件

 

比较常用的标志还有O_APPEND(总是在文件尾部添加数据)、O_CREAT(如果要打开的文件不存在就新建一个空文件)、O_EXCL(与O_CREAT结合使用表明如果文件已经存在,就不会打开文件)。

3、open()函数的错误:省略。

 

,从文件描述符对应的文件中读取数据。

#include <unistd.h> fd,  *buffer, size_t count);

fd为文件描述符;buffer为存储数据的缓冲区;count为最多能读取的字节数。

成功调用返回实际读取字节数,遇到文件结束符返回0,出现错误返回-1。

PS:要在缓冲区最后添加一个表示终止的空字符。

 

,往文件描述符对应的文件写入数据。

 #include <unistd.h>
 
 ssize_t write( fd,  *buffer, size_t count);

fd为文件描述符;buffer为存储数据的缓冲区;count为准备从buffer写入到文件的数据的字节数。

成功调用返回实际写入文件的字节数, 失败返回-1。

 

,关闭已经打开的文件描述符。

 #include <unistd.h>
 
  close( fd);

fd为文件描述符。

成功调用返回0,失败返回-1 。

 

所有类型的文件和设备驱动都实现了相同的I/O接口,所以无需针对特殊的文件编写代码。

文件偏移量:读写偏移量或指针,是执行下一个read和write操作的文件起始位置(相对与文件头部起始点)。

 

lseek(),改变文件偏移量。

 #include <unistd.h>
 
 off_t lseek( fd, off_t offset,  whence);

fd为文件描述符,offset为偏移量(字节),whence为表明解释offset参数的方法。

whence参数:

SEEK_SET 将文件偏移量设置为从文件头起始点开始的offset个字节
SEEK_CUR 相对于当前文件偏移量,再加上offset个字节
SEEK_END 将文件偏移量设置为起始于文件尾部的offset个字节

 

 

文件空洞

----《百度百科》

练习:

4-1:tee命令是从标准输入中读取数据,直至文件结尾,随后将数据写入标准输入和命令行参数所指定的文件。请使用I/O系统调用实现tee命令,默认情况下,若已存在命令行参数指定文件同名的文件tee命令会将其覆盖。如文件以存在,请实现-a命令行选项(tee -a file)在文件结尾出追加数据。

 
                 
 
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <ctype.h>
 #include 
 
  MAX_READ 20
 
  main( argc,  *           buf[MAX_READ +    
     (argc <  || strcmp(argv[], ) ==          usageErr( 
     fd = open(argv[argc-], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH |     (fd == -         errExit( 
     offset = lseek(fd,      ((opt = getopt(argc, argv, )) != -                                        
                 offset = lseek(fd, -                                                             fprintf(stderr, , argv[                     
 
     ((numRead = read(STDIN_FILENO, buf, MAX_READ)) >          buf[numRead] =          
         (write(STDOUT_FILENO, buf, numRead+) != (numRead+             fatal(         (write(fd, buf, numRead) !=             fatal(  
     (numRead == -         errExit( 
     (close(fd) == -         errExit( 
  }

测试:

lancelot@debian:~/Code/tlpi$  >~/Code/tlpi$ ~/Code/tlpi$ ./~/Code/tlpi$ ~/Code/tlpi$ ./my_tee -~/Code/tlpi$ 

 

4-2:编写一个类似cp命令的程序,当使用该程序复制一个包含空洞(连续的空字节)的普通文件时,要求目标文件的空的与源文件保持一致。

 
                 
 
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <ctype.h>
 #include 
 
  BUF_SIZE 1024
 
  main( argc,  *             
     (argc !=  || strcmp(argv[], ) ==          usageErr(, argv[ 
     inputFd = open(argv[     (inputFd == -         errExit(, argv[ 
     openFlags = O_CREAT | O_WRONLY |     filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH |     outputFd = open(argv[     (outputFd == -         errExit(, argv[ 
     ((numRead = read(inputFd, buf, BUF_SIZE)) >          (write(outputFd, buf, numRead) !=             fatal(     (numRead == -         errExit(     (close(inputFd) == -         errExit(     (close(outputFd) == -         errExit( 
  }

测试:首先通过书本的程序清单提供的seek_io.c来使t2出现空洞。

lancelot@debian:~/Code/tlpi$ ~/Code/tlpi$  -~/Code/tlpi$ ./~/Code/tlpi$ ~/Code/tlp./     

可以看到文件偏移量为50000的内容为空字节。。。。。

然后进行复制。

lancelot@debian:~/Code/tlpi$ ./~/Code/tlpi$  --rw-r--r--  lancelot lancelot   4月   :-rw-r--r--  lancelot lancelot   4月   :~/Code/tlpi$ ./     

可以看到两个文件的大小相同,而且从t3文件偏移量为50000开始读取5个字节都为空字节。

 

相关内容