8.7.3  fcntl 系统调用

这个系统调用功能比较多,可以执行多种操作,其内核函数在fs/fcntl.c中定义:

1.入口参数:

1fd欲访问文件的文件描述符

2cmd:要执行的操作的命令,这个参数定义了10个标志,下面介绍其中的5个,

F_DUPFDF_GETFDF_SETFDF_GETFL F_SETFL

3arg:可选,主要根据第二个命令来决定是否需要

2.出口参数:根据第二个参数的不同,这个返回值也不一样。

3.函数功能:

第二个参数是F_DUPFD,则进行复制文件描述符的操作。它需要用到第三个参数arg,这时arg是一个文件描述符,fcntl(fdF_DUPFDarg)files_struct结构中从指定的arg开始搜索空闲的文件描述符,找到第一个后,将fd的内容复制进来,然后将新找到的文件描述符返回。

第二个参数是F_GETFD,则返回files_struct结构中close_on_exec的值。无需第三个参数。

第二个参数是F_SETFD,则需要第三个参数,若arg最低位为1,则对close_on_exec置位,否则清除close_on_exec

第二个参数是F_GETFL,则用来读取open系统调用第二个参数设置的标志,即文件的打开方式(O_RDONLYO_WRONLYO_APPEND等),它不需要第三个参数。实际上上这时函数返回的是file结构中的flags域。

第二个参数是F_SETFL,则用来对open系统调用第二个参数设置的标志进行改变,但是它只能对O_APPENDO_NONBLOCK标志进行改变,这时需要第三个参数arg,用来确定如何改变。函数返回0表示操作成功,否则返回-1,并置一个错