为您找到搜索结果:7454个
系统数据文件和信息之附加组ID
4.2BSD引入了附加组ID(supplementarygroupID)的概念。我们不仅可以属于口令文件记录项中组ID所对应的组,也可属于多达16个另外的组。文件访问权限检查相应被修改为:不仅将进程的有效组ID与文件的组ID相比较,而且也将所有附加组ID与文件的组ID进行比较。常量NGROUPS_MAX规定了附加组ID的数量,其常用值是16.使用附加组ID的优点是不必再显式地经常更改组。一个用户会参加多个项目,因此也就要同时属于多个组。为了获取和设置附加组ID,提供了下列三个函数:#include<unistd.h>intgetgroups(intgidsetsize,gid_tgrouplist[]);返回值:若成功则返回附加组ID数,若出错则返回-1#include<grp.h>/*onLinux*/#include<unistd.h>/*onFreeBSD,MacOSX,andSolaris*/intsetgroups(intngroups,constgid_tgrouplist[]);#include<grp.h>/*onLinu...
系统数据文件和信息之组文件
UNIX组文件(POSIX.1称其为组数据库)包含了表6-3中所示的字段。这些字段包含在<grp.h>中所定义的group结构中。 表6-3/etc/group文件中的字段字段gr_mem是一个指针数组,其中每个指针各指向一个属于该组的用户名。该数组以空指针结尾。可以用...
系统数据文件和信息之阴影口令
加密口令是经单向加密算法处理过的用户口令副本。因为此算法是单向的,所以不能从加密口令猜测到原来的口令。历史上使用的算法总是从64字符集中产生13个可打印字符。某些较新的系统使用MD5算法对口令加密,为每个加密口令产生31个字符。给出一个加密口令,找不到一种算法可以将其逆转到普通文本口令(普通文本口令是在Password:提示符后键入的口令)。但是可以对口令进行猜测,将猜测的口令经单向算法变换成加密形式,然后将其与用户的加密口令相比较。为使企图这样做的人难以获得原始资料(加密口令),现在,某些系统将加密口令存放在另一个通常称为阴影口令(shadowpassword)的文件中。该文件至少要包含用户名和加密口令。与该口令相关的其他信息也可存放在该文件中(表6-2)。只有用户登录名和加密口令这两个字段是必需的。其他字段用于控制口令的改动频率(称为口令的衰老)以及账户保持活动状态的时间。阴影口令文件不应是一般用户可以读取的。仅有少数几个程序需要存取加密口令,例如login(1)和passwd(1),这些程序常常是设置用户ID为root的程序。有了阴影口令后,普通口令文件/etc/passwd可由...
系统数据文件和信息之口令文件
UNIX系统的口令文件(POSIX.1则将其称为用户数据库)包含了表6-1中所示的各字段,这些字段包含在<pwd.h>中定义的passwd结构中。注意,POSIX.1只指定了passwd结构包含的10个字段中的5个。大多数平台至少支持其中7个字段。 表6-1/etc/passwd文件中的字段由于历史原因,口令文件存储在/etc/...
标准I/O库之临时文件
ISOC标准I/O库提供了两个函数以帮助创建临时文件。#include<stdio.h>char*tmpnam(char*ptr);返回值:指向唯一路径名的指针FILE*tmpfile(void);返回值:若成功则返回文件指针,若出错则返回NULL若ptr是NULL,则所产生的路径名存放在一个静态区中,指向该静态区的指针作为函数值返回。下一次调用tmpnam时,会重写该静态区(这意味着,如果我们调用此函数多次,而且想保存路径名,则我们应该保存该路径名的副本,而不是指针的副本)。如若ptr不是NULL,则认为它指向长度至少是L_tmpnam个字符的数组(常量L_tmpnam定义在头文件<stdio.h>中)。所产生的路径名存放在该数组中,ptr也作为函数值返回。tmpfile创建一个临时二进制文件(类型wb+),在关闭该文件或程序结束时将自动删除这种文件。注意,UNIX对二进制文件不作特殊区分。程序清单5-4tmpnam和tmpfile函数实例[root@localhostapue]#catprog5-4.c#include"apue.h"intmain(void...
文件和目录之文件访问权限位小结
表4-12文件访问权限位小结常量说明对普通文件的影响对目录的影响S_ISUIDS_ISGID设置用户ID设置组ID执行时设置有效用户ID若组执行位设置,则执行时设置有效组ID,否则使强制性记录锁起作用(若支持)(不使用)将在目录中创建的新文件的组ID设置为目录的组IDS_ISVTX粘住位在交换区保存程序正文(若支持)限制在目录中删除和更名文件S_IRUSRS_IWUSRS_IXUSR用户读用户写用户执行许可用户读文件许可用户写文件许可用户执行文件许可用户读目录项许可用户在目录中删除和创建文件许可用户在目录中搜索给定路径名S_IRGRPS_IWGRPS_IXGRP组读组写组执行许可组读文件许可组写文件许可组执行文件许可组读目录项许可组在目录中删除和创建文件许可组在目录中搜索给定路径名S_IROTHS_IWOTHS_IXOTH其他读其他写其他执行许可其他读文件许可其他写文件许可其他执行文件许可其他读目录项许可其他在目录中删除和创建文件许可其他在目录中搜索给定路径名 最后9个常量分成3组,因为:S_IRWXU=S_IRUSR|S_IWUSR|S_IXUSRS_IRWXG=S_IRG...
文件和目录之设备特殊文件
st_dev和st_rdev:每个文件系统所在的存储设备都由主、次设备号表示。设备号所用的数据类型是基本系统数据类型dev_t。主设备号标识设备驱动程序,有时编码为与其通信的外设板;次设备号标识特定的子设备。例如,磁盘驱动器经常包含若干个文件系统。在同一磁盘驱动器上的各文件系统通常具有相同的主设备号,但它们的次设备号却不同。我们通常可以使用两个宏,即major和minor来访问主、次设备号,大多数实现都定义了这两个宏。这就意味着我们无需关心这两个数是如何存放在dev_t对象中的。Linux将宏major和minor定义在头文件<sys/sysmacros.h>中,而该头文件又包括在<sys/type.h>中。系统中与每个文件名关联st_dev值是文件系统的设备号,该文件系统包含了这一个文件名以及与其对应的i节点。只有字符特殊文件和块特殊文件才有st_rdev值。此值包含实际设备的设备号。The st_dev field describes thedeviceonwhichthisfileresides.Thest_rdev...
文件和目录之chdir、fchdir和getcwd函数
每个进程都有一个当前工作目录,此目录是搜索所有相对路径名的起点(不以斜杠开始的路径名为相对路径名)。当用户登录到UNIX系统时,其当前工作目录通常是口令文件(/etc/passwd)中该用户登录项的第6个字段——用户的起始目录(homedirectory)。当前工作目录是进程的一个属性,起始目录则是登录名的一个属性。进程通过调用chdir或fchdir函数可以更改当前工作目录。#include<unistd.h>intchdir(constchar*pathname);intfchdir(intfiledes);两个函数的返回值:若成功则返回0,若出错则返回-1在这两个函数中,分别用pathname或打开文件描述符来指定新的当前工作目录。实例因为当前工作目录是进程的一个属性,所以它只影响调用chdir的进程本身,而不影响其他进程。程序清单4-8chdir函数实例[root@localhostapue]#catprog4-8.c#include"apue.h"intmain(void){if(chdir("/tmp")<0)err_sys("chdirfailed");...
文件和目录之读目录
对某个目录具有访问权限的任一用户都可读该目录,但是,为了防止文件系统产生混乱,只有内核才能写目录。一个目录的写权限位和执行权限位决定了在该目录中能否创建新文件以及删除文件,它们并不表示能否写目录本身。#include<dirent.h>DIR*opendir(constchar*pathname);返回值:若成功则返回指针,若出错则返回NULLstructdirent*readdir(DIR*dp);返回值:若成功则返回指针,若在目录结尾或出错则返回NULLvoidrewinddir(DIR*dp);intclosedir(DIR*dp);返回值:若成功则返回0,若出错则返回-1longtelldir(DIR*dp);返回值:与dp关联的目录中的当前位置voidseekdir(DIR*dp,longloc); 头文件<dirent.h>中定义的dirent结构与实现有关。几种典型的UNIX实现对此结构所作的定义至少包含下列两个成员:structdirent{ino_td_ino;/*i-nodenumber*/chard_name[NAME_MAX+1...
文件和目录之mkdir和rmdir函数
用mkdir函数创建目录,用rmdir函数删除目录。#include<sys/stat.h>intmkdir(constchar*pathname,mode_tmode);返回值:若成功则返回0,若出错则返回-1此函数创建一个新的空目录。其中,.和..目录项是自动创建的。所指定的文件访问权限mode由进程的文件模式创建屏蔽字修改。常见的错误时指定与文件相同的mode(只指定读、写权限)。但是,对于目录通常至少要设置1个执行权限位,以允许访问该目录中的文件名。用rmdir函数可以删除一个空目录。空目录是只包含.和..这两项的目录。#include<unistd.h>intrmdir(constchar*pathname);返回值:若成功则返回0,若出错则返回-1 如果调用此函数使目录的链接计数成为0,并且也没有其他进程打开此目录,则释放由此目录占用的空间。如果在链接计数达到0时,有一个或几个进程打开了此目录,则在此函数返回前删除最后一个链接及.和..项。另外,在此目录中不能再创建新文件。但是在最后一个进程关闭它之前并不释放此目录。(即使另一个进程打开该目...
文件和目录之utime函数
一个文件的访问和修改时间可以用utime函数更改。#include<utime.h>intutime(constchar*pathname,conststructutimbuf*times);返回值:若成功则返回0,若出错则返回-1此函数所使用的数据结构是:structutimbuf{time_tactime;/*accesstime*/time_tmodtime;/*modificationtime*/} 此结构中的两个时间值是日历时间。这是自1970年1月1日00:00:00以来国际标准时间所经过的秒数。此函数的操作以及执行它所要求的特权取决于times参数是否是NULL。如果times是一个空指针,则访问时间和修改时间两者都设置为当前时间。为了执行此操作必须满足下列两个条件之一:进程的有效用户ID必须等于该文件的所有者ID;或者进程对该文件必须具有写权限。如果times是非空指针,则访问时间和修改时间被设置为times所指向结构中的值。此时,进程的有效用户ID必须等于该文件的所有者ID,或者进程必须是一个超级用户进程。对文件只有写权限是不够的。注意,我们不能...
文件和目录之文件的时间
本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。对每个文件保持有三个时间字段,它们的意义见表4-10: 表4-10与每个文件相关的三个时间值字段说明例子ls(1)选项st_atime文件数据的最后访问时间read-ust_mtime文件数据的最后修改时间write默认st_ctimei节点状态的最后更改时间chmod、chown-c 注意修改时间(st_mtime)和更改状态时间(st_ctime)之间的区别。修改时间是文件内容最后一次被修改的时间。更改状态时间是该文件的i节点最后一次被修改的时间。很多操作,例如,更改文件的访问权限、用户ID、链接数等,都会影响到i节点,但它们并没有更改文件的实际内容。因为i节点中的所有信息都是与文件的实际内容分开存放的,所以,除...
文件和目录之symlink和readlink函数
symlink函数创建一个符号链接。#include<unistd.h>intsymlink(constchar*actualpath,constchar*sympath);返回值:若成功则返回0,若出错则返回-1该函数创建了一个指向actualpath的新目录项sympath,在创建此符号链接时,并不要求actualpath已经存在。并且,actualpath和sympath并不需要位于同一文件系统中。因为open函数跟随符号链接,所以需要有一种方法打开该链接本身,并读该链接中的名字。readlink函数提供了这种功能。#include<unistd.h>ssize_treadlink(constchar*restrictpathname,char*restrictbuf,size_tbufsize);返回值:若成功则返回读到的字节数,若出错则返回-1此函数组合了open、read和close的所有操作。如果此函数成功执行,则它返回读入buf的字节数。在buf中返回的符号链接的内容不以null字符终止。...
文件和目录之符号链接
本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。 符号链接是指向一个文件的间接指针,它与硬链接有所不同,硬链接直接指向文件的i节点。引入符号链接的原因是为了避开硬链接的一些限制:硬链接通常要求链接和文件位于同一文件系统中。只有超级用户才能创建指向目录的硬链接。对符号链接以及它指向何种对象并无任何文件系统限制,任何用户都可创建指向目录的符号链接。符号链接一般用于将一个文件或整个目录结构移到系统中的另一个位置。当使用以名字引用文件(而不是用打开文件的描述符引用文件)的函数时,应当了解该函数是否处理符号链接。也就是该函数是否跟随符号链接到达它所链接的文件。如果该函数具有处理符号链接的功能,则其路径名参数引用由符号链接指向的文件。否则,路径名参数将引用链接本身,而不是该链接指向的文件。表4-9列出了文件和目录章节中说明的各个函数是否处理符号链接。在表4-9中没有列出mkdir、mkinfo、mknod和rmdir这些函数,其原因是,当路径名是符号链接时,它们都出错返回。以文件描述符...
文件和目录之link、unlink、remove和rename函数
任何一个文件可以有多个目录项指向其i节点。创建一个指向现有文件的链接的方法是使用link函数。#include<unistd.h>intlink(constchar*existingpath,constchar*newpath);返回值:若成功返回0,若出错返回-1此函数创建一个新目录项newpath,它引用现有的文件existingpath。如若newpath已经存在,则返回出错。只创建newpath中的最后一个分量,路径中的其他部分应当已经存在。创建新目录项以及增加链接计数应当是个原子操作。虽然POSIX.1允许实现支持跨文件系统的链接,但是大多数实现要求这两个路径名在同一个文件系统中。如果实现支持创建指向一个目录的硬链接,那么也仅限于超级用户才可以这样做。其理由是这样做可能在文件系统中形成循环,大多数处理文件系统的实用程序都不能处理这种情况。因此很多文件系统实现不允许对目录的硬链接。为了删除一个现有的目录项,可以调用unlink函数。#include<unistd.h>intunlink(constchar*pathname);返回值:若成功则返回0,若出...