2010年(17)
分类: LINUX
2010-06-12 21:28:28
Chapter3 File
I/O
lseek
如果文件描述副引用的是一个管道FIFO或我那个罗套接字,则无法设置偏移量,lssk返回-1。若偏移量为负值,也返回-1。
文件偏移量可以超过文件的当前长度,在这种情况下,对文件的下次写将加长该文件,并在文件中构成一个空洞,这一点是允许的。位于文件中但没有写过的字节都被读为0。
最好将read的缓冲设为4096字节,即一页的大小。另外,大多数文件系统会采用预读技术(read ahead)。经过实验,预读大小为128KB,
每个进程有该进程打开的文件描述符表,每个项包换一个文件指针指向文件表。每个文件表项包括文件状态标志 文件偏移量和指向该文件inode的指针。dup的作用就是将文件描述符表中的两个表项的文件指针指向同一个文件表。
Chapter4 File & Directory
struct stat表示文件的所有属性
文件类型:用提供的宏来判断,如if(S_ISDIR(buf.st_mode))
uid和gid:文件将其所有者的用户ID和组ID记录在stat结构的st_uid和st_gid
实际用户ID和实际组ID: 用于标识用户究竟是谁。这两个字段在登录时取自口令文件中的登录项。可以使用getuid和getgid函数查询。
有效用户ID和有效组ID,附加组ID: 用于文件访问权限检查。可以使用geteuid和getegid函数查询。
保存的设置用户ID和保存的设置组ID: 执行时包含了有效用户ID和有效组ID的副本。
通常有效用户/组ID就是实际用户/组ID。但是st_mode中包含两个设置ID位,如果被设置,则执行此文件时,将有效用户/组ID设置为文件所有者的用户/组ID。程序对文件的访问权限主要就是看有效用户ID和组用户ID,这样普通用户也可以拥有超级用户的权限。
文件访问权限检查
进程每次打开,创建或删除一个文件时,内核就进行文件访问权限检查。内核按顺序执行以下四步,一旦满足就停止检查:
1若进程的有效用户ID是0(超级用户),则允许访问。
2若进程的有效用户ID等于文件的所有者ID,并且适当的访问权限位被设置,则允许访问,否则拒绝访问。
3若进程的有效组ID或进程的附加组ID等于文件所有者的组ID,并且适当的访问权限位被设置,则允许访问,否则拒绝。
4若其他用户适当的访问权限位被设置,则允许访问,否则拒绝访问。
新文件和目录的所有权
新文件的用户ID设置为进程的有效用户ID。
新文件的组ID取决于它所在目录st_mode中的设置组ID位是否设置。如果该目录的这一位已经设置,则将新文件的组ID设置为目录的组ID,否则将新文件的组ID设置为进程的有效组ID。
文件系统
硬链接:两个目录项引用一个inode
符号链接:在数据块中保存改符号链接指向的文件的名字
1.硬链接要求同一文件系统内
2.只有超级用户可以创建硬链接
Chapter7
环境变量是一个字符指针数组
char*getenv(char *name);
共享库
使得可执行文件中不许呀包含共用的库例程,这样减少了可执行文件的大小。
gcc -static hello.c
-阻止gcc使用共享库
setjmp和longjmp
调用longjmp后使程序返回setjmp的地方,并且使setjmp返回longjmp的第二个参数。
getrlimit和setrlimit
int getrlimit(int resource,struct rlimit *rlptr);
int setrlimit(int resource,const struct rlimit *rlptr);
struct rlimit{
rlim_t
rlim_cur;
rlim_t
rlim_max;
};
这两个函数的resource参数常用的有:
RLIMIT_DATA 数据段的最大字节长度
RLIMIT_STACK 栈的最大字节长度
RLIMIT_RSS RSS段最大长度
RLIMIT_AS 进程可用存储区最大总长度
RLIMIT_CPU CPU时间的最大量值,超过时则向该进程发送SIGXCPU信号
RLIMIT_FSIZE 可以创建文件最大长度,超过时则向该进程发送SIGXFSZ信号
Chapter8 进程控制
fork
vfork 用作创建子进程,这个子进程进行exec。
1.由于认为子进程会立刻调用exec或exit,子进程也在父进程地址空间内运行。
2.保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。
3.也由于在父进程地址空间内运行,子进程对变量的修改也会影响父进程。
Wait waitpid
Wait3 wait4还可获得所有子进程所用资源。
如果一个进程fork一个子进程,但不要它等待子进程终止,也不希望子进程处于僵死状态直至父进程终止,实现这一要求的技巧是fork两次。其中迅速使第一次fork产生的子进程终止,使第二个fork产生的子进程被init接管。
更改用户ID和组ID
进程时间
clock_t times(struct tms *buf) tms结构包含用户时间和系统时间,返回值为实际时间
使用方法调用两次times计算差值