这个系统调用功能比较多,可以执行多种操作,其内核函数在fs/fcntl.c中定义:
1.入口参数:
(1)fd:欲访问文件的文件描述符
(2)cmd:要执行的操作的命令,这个参数定义了10个标志,下面介绍其中的5个,
F_DUPFD、F_GETFD、F_SETFD、F_GETFL和
F_SETFL
(3)arg:可选,主要根据第二个命令来决定是否需要
2.出口参数:根据第二个参数的不同,这个返回值也不一样。
3.函数功能:
第二个参数是F_DUPFD,则进行复制文件描述符的操作。它需要用到第三个参数arg,这时arg是一个文件描述符,fcntl(fd,F_DUPFD,arg)在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_RDONLY,O_WRONLY,O_APPEND等),它不需要第三个参数。实际上上这时函数返回的是file结构中的flags域。
第二个参数是F_SETFL,则用来对open系统调用第二个参数设置的标志进行改变,但是它只能对O_APPEND和O_NONBLOCK标志进行改变,这时需要第三个参数arg,用来确定如何改变。函数返回0表示操作成功,否则返回-1,并置一个错