您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > Linux环境高级编程-文件和目录标准IO
文件和目录文件类型用户ID和组ID文件访问权限文件时间文件长度硬连接和符号连接目录操作标准IO标准I/O库打开流定位流读写流格式化输出临时文件系统数据文件口令文件其他数据系统标识系统日期、时间文件类型用户ID和组ID文件访问权限文件时间文件长度硬连接和符号连接目录操作用于获取有关文件的信息结构函数原型intstat(constchar*pathname,structstat*buf);intfstat(intfiledes,structstat*buf);intlstat(constchar*pathname,structstat*buf);参数与返回值参数pathname:文件名,需要获取该文件的信息参数filedes:文件描述符参数buf:stat函数将pathname对应的文件信息,填入buf指向的stat结构中返回值:0成功;-1出错区别:stat通过文件名返回文件的信息;fstat通过文件描述符stat返回符号链接所引用的文件信息;lstat返回符号链接本身的信息structstat{ino_tst_ino;/*inodenumber*/mode_tst_mode;/*filetype&mode*/nlink_tst_nlink;/*numberofhardlinks*/uid_tst_uid;/*userIDofowner*/gid_tst_gid;/*groupIDofowner*/off_tst_size;/*totalsize,inbytes*/unsignedlongst_blksize;/*blocksize*/unsignedlongst_blocks;/*numberofblocksallocatedtime_tst_atime;/*timeoflastaccess*/time_tst_mtime;/*timeoflastmodification*/time_tst_ctime;/*timeofinodelastchange*/};Linux系统中的常见文件类型有:普通文件目录文件字符特殊文件提供对设备不带缓冲的访问块特殊文件提供对设备带缓冲的访问FIFO文件用于进程间的通信,命名管道套接口文件用于网络通信符号链接使文件指向另一个文件使用如下的宏,判断文件类型普通文件S_ISREG()目录文件S_ISDIR()字符特殊文件S_ISCHR()块特殊文件S_ISBLK()FIFO文件S_ISFIFO()套接口文件S_ISSOCK()符号连接S_ISLINK()示例代码:structstatbuf;lstat(filename,&buf);if(S_ISDIR(buf.st_mode))cout“directory”endl;注意,此处必须用lstat获取文件信息,而不用stat,为什么?第一种ID:Linux是一个多用户操作系统。每个用户都有一个ID,用以唯一标识该用户。这个ID被称为UID。每个用户都属于某一个组,组也有一个ID。这个ID,被称为组ID,GID。第二种ID:文件所有者相关文件所有者ID:拥有某文件的用户的ID文件所有者组ID:拥有某文件的用户所属组的ID第三种ID:实际用户ID和实际组ID进程的实际用户ID:运行该进程的用户的ID进程的实际组ID:运行该进程的用户所属的组ID第四种ID:有效用户ID和有效组ID进程的有效用户ID:用于文件访问权限的检查进程的有效组ID:用于文件访问权限的检查大多数情况下有效用户/组ID=实际用户/组ID第五种ID:保存设置用户ID和保存的设置组ID保存的设置用户ID保存的设置组ID上述两者在执行一个程序时包含了有效用户ID和有效组ID的副本用于更改文件的用户ID和组ID函数原型intchown(constchar*pathname,uid_towner,gid_tgroup);intfchown(intfd,uid_towner,gid_tgroup);intlchown(constchar*pathname,uid_towner,gid_tgroup);参数与返回值参数pathname:被改的文件名参数owner:文件新的所有者ID参数group:文件新的所有者所在组的ID返回值:0成功;-1出错lchown更改符号链接本身的所有者,而不是符号链接所指向的文件超级用户进程可以更改文件的用户ID非超级用户进程拥有某文件,可以更改该文件用户ID你可以修改你所拥有的文件的组ID,但只能改到你所属于的组Linux是一个多用户的操作系统,从安全或者隐私考虑,通常一个文件并不是所有用户都能够访问的。structstat{.......................................................ino_tst_ino;/*inodenumber*/mode_tst_mode;/*filetype&mode*/nlink_tst_nlink;/*numberofhardlinks*/uid_tst_uid;/*userIDofowner*/gid_tst_gid;/*groupIDofowner*/off_tst_size;/*totalsize,inbytes*/unsignedlongst_blksize;/*blocksize*/unsignedlongst_blocks;/*numberofblocksallocatedtime_tst_atime;/*timeoflastaccess*/time_tst_mtime;/*timeoflastmodification*/time_tst_ctime;/*timeofinodelastchange};包含了文件访问权限位76543210111098st_mode的低12bit9个文件访问权限位设置用户ID设置组ID粘住位76543210111098st_mode的低12bit指示文件所有者是否可执行指示文件所有者是否可写指示文件所有者是否可读指示组用户是否可执行指示组用户是否可写指示组用户是否可读指示其他用户是否可执行指示其他用户是否可写指示其他用户是否可读st_mode屏蔽意义S_IRUSR用户-读S_IWUSR用户-写S_IXUSR用户-执行S_IRGRP组-读S_IWGRP组-写S_IXGRP组-执行S_IROTH其他-读S_IROTH其他-写S_IWOTH其他-执行if(buf.st_mode&S_IRUSR){用户可读}open的第三个参数creat的第二个参数执行许可权表示可以搜索该目录(或进入该目录)。读许可权允许读目录,获得该目录中所有文件名的列表;用名字打开任一类型的文件时,对该名字中包含的每一个目录,包括它可能隐含的当前工作目录都应具有执行许可权。如:为了打开文件/usr/dict/words,需要具有对目录/,/usr,/usr/dict的执行许可权。为了在open函数中对一个文件指定O_TRUNC标志,必须对该文件具有写许可权;为了在一个目录中创建一个新文件,必须对该目录具有写许可权和执行许可权;为了删除一个文件,必须对包含该文件的目录具有写许可权和执行许可权,对该文件本身则不需要有读、写许可权;如果用6个exec函数中的任何一个执行某个文件,都必须对该文件具有执行许可权。进程访问文件时,内核就进行文件存取许可权测试。这种测试可能涉及到文件的所有者ID、进程有效ID以及进程的添加组ID。两个所有者ID是文件的性质,而有效ID与添加组ID是进程的性质:若进程的有效用户ID是0,则允许存取;若进程的有效用户ID等于文件的所有者ID(即该进程拥有文件)若所有者存取许可权被设置,则允许存取否则拒绝存取若进程的有效组ID或进程的添加组ID之一等于文件组ID:若组存取许可权被设置,则允许存取否则拒绝存取若其他用户存取许可权被设置,则允许存取,否则拒绝存取设置用户ID位和设置组ID位在可执行文件的权限标记中,有一个“设置用户ID位”若该位被设置,表示:执行该文件时,进程的有效用户ID变为文件的所有者对于设置组ID位类似通过命令行设置用户ID位chmodu+sfilenamechmodg+sfilenamechmodu-sfilenamechmodg-sfilename每个用户都可以使用passwd命令修改密码passwd命令需要修改/etc/passwd文件ls-l/etc/passwd该文件属于超级用户,非超级用户无修改权限ls-l/usr/bin/passwdpasswd设置了设置用户ID位新文件的所有者ID:即创建该文件的进程的有效用户ID新文件的组ID:两种方式创建该文件的进程的有效组ID新文件所在目录的组IDLinux中的处理取决于新文件所在目录的设置组ID是否被设置若设置,新文件的组ID即目录的组ID76543210111098st_mode的低11bit9个文件访问权限位设置用户ID设置组ID粘住位在UNIX早期版本中,有一位被称为粘住位,如果一可执行程序文件的这一位被设置了,那么在该程序第一次执行并结束时,该程序正文被保存在交换区中,这使得下次执行该程序时能较快地将其装入内存。现今较新的UNIX系统大多数都具有虚存系统以及快速文件系统,所以不再需要使用这种技术。如果对一个目录设置了粘住位,则只有对该目录具有写许可权的用户并且满足下列条件之一,才能删除或更名该目录下的文件:◦拥有此文件。◦拥有此目录。◦是超级用户。目录/tmp和/var/spool/uucppublic是设置粘住位的候选者—这两个目录是任何用户都可在其中创建文件的目录。这两个目录对任一用户(用户、组和其他)的许可权通常都是读、写和执行。但是用户不应能删除或更名属于其他人的文件,为此在这两个目录的文件方式中都设置了粘住位用于按实际用户ID和实际组ID进行存取许可权测试注意:此时不管设置用户ID和设置组ID函数原型:intaccess(constchar*pathname,intmode);参数第一个参数pathname:要测试的文件名第二个参数mode:四种取值方式R_OK测试读许可权W_OK测试写许可权X_OK测试执行许可权F_OK测试文件是否存在返回值若成功则为0,出错则为-1用于为进程设置文件方式创建屏蔽字,即参与指定文件的访问权限函数原型:mode_tumask(mode_tcmask);参数和返回值cmask:9个权限常量的组合(通过或运算)返回值:以前的文件方式创建屏蔽字umask(0)未设置任何屏蔽字,creat或open相关参数即指定了文件的访问权限umask(S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)禁止所有组和其他用户的存取许可权即使open/creat设置了也无用用于改变现有文件的存取许可权函数原型:intchmod(constchar*pathname,mode_tmode);intfchmod(intfiledes,mode_tmode);参数和返回值参数pathname:要改变权限的文件参数filedes:要改变权限的文件描述符参数mode:新的存取权限位组合返回值:成功则为0,出错则为-1常数说明对普通文件的影响对目录的影响S_ISUID设置-用户-ID执行时设置有效用户ID(不使用)S_ISGID设置-组-ID若组执行位设置,则执行时置有效组ID将在目录中创建新文件的组ID设置为目录的组IDS_ISVTX粘住位在交换区保存程序正文禁止在目录中删除和更名文件S_IRUSR用户读许可用户读文件许可组用户目录项S_IWUSR用户写许可用户写文件许可用户在目录中删除或创建文件S_IXUSR用户执行许可用户执行文件
本文标题:Linux环境高级编程-文件和目录标准IO
链接地址:https://www.777doc.com/doc-2884930 .html