unix环境高级编程笔记--持续更新

17 篇文章 1 订阅
第一章.Unix系统基础知识

1.unix体系结构:应用->shell/公用函数库->系统调用->内核,其中shell为运行其他应用程序提供接口

2.cat /etc/passwd口令文件可以修改用户登陆信息

3.Linux使用的shell通常是/bin/bash或者/bin/sh

4.创建目录时会自动创建两个文件名:.(成为点)..(点点)。.代表当前目录,而..代表父目录

5.只有打开的文件才有文件描述符(fd,而当运行一个新程序时,shell都会打开三个文件描述符:STDIN_FILENOfd=0),STDOUT_FILENO(fd=1)STDERR_FILENO(fd=2)

6.标准输入,标准输出可以重定向到文件,也就是说假设你在程序中使用STDIN_FILENOSTDOUT_FILENO,生成的程序是a.out,那么可以用./a.out < abc.c >def.c.其中<abc.c代表STDIN_FILENO>def.c代表STDOUT_FILENO

7.函数open,read,write,lseekclose都是不带缓冲的I/O,这些函数使用fd且需要缓冲时要自己定义

8.STDIN_FILENOstdin不同,前者是文件描述符,后者是标准I/O常量定义在stdio.h文件中

9.内核使用exec函数将程序读入内存,并执行程序

10.Ctrl+D是默认的文件结束符,相当于字符NULLCtrl+Z 可以在shell中强制结束程序;Ctrl+C是可以在shell中断程序,在shell中按下这些键相当于向运行在shell上的进程发送信号

11.<errno.h>中将出错分为两类:致命性和非致命性,与资源相关的非致命性出错有:EAGAINENFILEENOBUFSENOLCKENOSPCEWOULDBLOCKENOMEM等,
对于这些资源相关的非致命性出错,典型恢复操作是延迟一段时间,然后重试

12.每个用户都有唯一的一个用户ID(可以通过口令文件/etc/passwd查看),root用户的ID0,如果将一个进程赋予了root权限(例如shell),那么该进程执行的操作系统都不再检查。每个组都有一个组ID,一个用户最多可以属于16个不同的组,可以通过查看/etc/group文件

13.可以通过在一个进程中调用kill函数向另一个进程发送信号,不过前提我们必须是那个进程的所有者或者root才可以(每个进程都有它的权限,权限很重要)

14.各种信号的前缀都是SIGXXX。。。当需要捕捉信号时,程序可以使用signal函数,用法:signal(SIGXXX,sig_xxx)==SIG_ERR;其中SIGXXX是表示信号类型,sig_xxx表示此信号发生时执行的函数名,如果函数的返回值==SIG_ERR表示出错,我们可以在程序的任意一处调用signal函数,不管程序执行到哪里,只要信号一发生,就会于执行signal函数

15.日历时间:指从1970.1.1起到现在的秒数;进程时间:由时钟时间(进程运行的时间总量),用户时间(在用户态执行程序的时间),系统时间(在内核态执行程序的时间)

16.unix系统调用中处理存储器空间分配的是sbrk;应用程序既可以调用系统调用也可以调用库函数



第二章.Unix标准及实现

1.unix系统大部分函数执行失败的返回值都是-1,成功则是正整数

2.三个函数(unistd.h)long sysconf(int name);系统的各种限制(最大值)
long pathconf(const char *pathname,int name);(文件的各种限制)
long fpathconf(int fd,int name);(同上)
其中name的参数见书中34(很多很重要)
其实在头文件<limits.h>中也有相关的定义

3.C语言中将常数叫做幻数,但是我们应该尽量避免使用幻数,而是用宏定义或者枚举,建议使用枚举,因为它是编译阶段存在的符号,编译器的提示会更清晰、更准确。

#defineARRAY_SIZE 10

enum{ARRY_SIZE= 10}


4.如果在编译一个程序时,希望它只与POSIX的定义相关,而不与其他定义的常量冲突,那么就需要定义常量POSIX_C_SOURCEEg: cc -D_POSIX_C_SOURCE=200809L file.c或者在程序第一行中#define POSIX_C_SOURCE 200809L


5.系统的数据类型存放在<sys/types.h>中,绝大多数都是后面带_t的,例如:clock_t(时钟滴答计算器进程时间),gid_tpid_tuid_ttime_t(日历时间的秒计算器),size_t(对象长度例如字符串),ssize_t(返回字节的计数器)等



第三章.文件I/O

1.函数不带缓冲指的是:每个函数都调用系统中的一个系统调用。使用文件操作函数时通常要加头文件<fcntl.h>

2.openconst char *path,int flag,...;open函数成功打开一个文件时,返回该文件的文件描述符oflag参数有:O_RDONLY,O_WRONLY,O_RDWR,O_EXEC。这四个常量可以和其他常量进行运算,其他常量见书中:50页。

3.每个进程都会打开三个文件:STDIN_FILENOSTDOUT_FILENOSTDERR_FILENO

4.open函数中的path参数指定的是绝对路径名,如果要使用相对路径那么可以使用openatint fd,const char *path,int oflag,...;path是绝对路径那么openat函数和open函数相同,如果path是相对路径那么fdpath在文件系统的开始目录的文件描述符

5.linux系统中如果文件名超过255就会返回出错,并将errno设置为ENAMETOOLONG

6.int createconst char *path,mode_t mode;create函数返回一个只读的文件描述符,其中mode_t是文件创建类型,因此通常都是用open(path,O_RDWR|O_CREAT|O_TRUNC,mode);来创建文件

7.int close(int fd);若成功返回0,失败返回-18.当一个进程终止时,内核会释放所有它打开的文件

9.off_t lseek(int fd,off_t offset,int whence);whenceSEEK_SET,则返回的文件偏移量=文件开头+offset;若whenceSEEK_CUR,则返回的文件偏移量=当前文件偏移量+offset;若whenceSEEK_END,则返回的文件偏移量=文件长度+offset。(offset可正可负),对于管道,FIFO或网络套接字,不能设置文件偏移量

10.ssize_t read(int fd,void *buf,size_t bytes);若成功返回读到的字节数并将它存储在buf中,失败返回-1read函数从文件的当前偏移量开始读,且会改变文件的偏移量



11.ssize_tsize_t的区别:ssize_t是带符号整形(正整数,0-1),而size_t是不带符号整形,必须是正整数

12.ssize_t write(int fd,const void *buf,size_t bytes);若成功则返回写入的字节数,失败返回-1write函数从当前文件偏移量开始写,可以用O_APPEND将文件偏移量设置在文件末尾。Write函数会改变文件偏移量

13.linux一个磁盘块是4096个字节

14.每个进程都有一个fd,每个fd都指向一个文件表项(文件状态,偏移量,指向i节点的指针),i节点存储文件的详细信息。如果两个进程访问同一个文件,那么它们各自拥有一个文件表项,指向同一个i节点

15.任何多余一个函数调用的操作都不是原子操作,内核有可能会临时挂起进程。当多个进程写同一个文件时,我们就不应该先调用lseek定位然后调用write写,我们可以open文件时用O_APPEND每次写时i节点都会更新文件表项的偏移量),然后在write写就不会出现错误





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值