48小时系统班试听入口

【运维实用技术点】Linux编程下open()函数的用法

发布作者:新盟教育 发布日期:2022-10-19 浏览人数:4145人

运维实用技术点

    

WX20221019-143438@2x.png


Linux编程下open()函数的用法

open(打开文件) :

相关函数:

 read,write,fcntl,close,link,stat,umask,unlink,fopen


表头文件 :

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>


定义函数:

int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);


返回值:若所有欲核查的权限都通过了检查则返回0值,表示成功,只要有一个权限被禁止则返回-1。

一般的写法是:

if((fd=open("/dev/ttys0",O_RDWR | O_NOCTTY | O_NDELAY)<0)
{
 perror("open");
}


这个事常用的一种用法fd是设备描述符,linux在操作硬件设备时,屏蔽了硬件的基本细节,只把硬件当做文件来进行操作,而所有的操作都是以open函数来开始,它用来获取fd,然后后期的其他操作全部控制fd来完成对硬件设备的实际操作。你要打开的/dev/ttyS0,代表的是串口1,也就是常说的com1,后面跟的是一些控制字。

函数说明:

第一个参数pathname指向欲打开的文件路径字符串。

第二参数flags所能使用的旗标:

  • O_RDONLY只读打开。

  • O_WRONLY只写打开。

  • O_RDWR读、写打开。

  • O_APPEND每次写时都加到文件的尾端。

  • O_CREAT若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明该新文件的存取许可权位。

  • O_EXCL如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。

  • O_TRUNC如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。

  • O_NOCTTY如果pathname指的是终端设备,则不将此设备分配作为此进程的控制终端。

  • O_NONBLOCK如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式。

  • O_NDELAY所产生的结果使I/O变成非阻塞模式(non-blocking),在读取不到数据或是写入缓冲区已满会马上return,而不会阻塞等待。

  • O_SYNC使每次write都等到物理I/O操作完成。

  • O_APPEND当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。

  • O_NOFOLLOW如果参数pathname所指的文件为一符号连接,则会令打开文件失败。

  • O_DIRECTORY如果参数pathname所指的文件并非为一目录,则会令打开文件失败。


注意:

(1)这些控制字都是通过“或”符号分开(|)。

(2)O_NONBLOCK和O_NDELAY所产生的结果都是使I/O变成非阻塞模式(non-blocking),在读取不到数据或是写入缓冲区已满会马上return,而不会阻塞等待。

它们的差别在于:在读操作时,如果读不到数据,O_NDELAY会使I/O函数马上返回0,但这又衍生出一个问题,因为读取到文件末尾(EOF)时返回的也是0,这样无法区分是哪种情况。因此,O_NONBLOCK就产生出来,它在读取不到数据时会回传-1,并且设置errno为EAGAIN。

O_NDELAY是在System V的早期版本中引入的,在编码时,还是推荐POSIX规定的O_NONBLOCK,O_NONBLOCK可以在open和fcntl时设置。

(3)Linux2.2以后特有的旗标,以避免一些系统安全问题。参数mode 则有下列数种组合,只有在建立新文件时才会生效,此外真正建文件时的权限会受到umask值所影响,因此该文件权限应该为(mode-umaks)。

  • S_IRWXU00700权限,代表该文件所有者具有可读、可写及可执行的权限。

  • S_IRUSR 或S_IREAD,00400权限,代表该文件所有者具有可读取的权限。

  • S_IWUSR 或S_IWRITE,00200权限,代表该文件所有者具有可写入的权限。

  • S_IXUSR 或S_IEXEC,00100权限,代表该文件所有者具有可执行的权限。

  • S_IRWXG 00070权限,代表该文件用户组具有可读、可写及可执行的权限。

  • S_IRGRP 00040权限,代表该文件用户组具有可读的权限。

  • S_IWGRP 00020权限,代表该文件用户组具有可写入的权限。

  • S_IXGRP 00010权限,代表该文件用户组具有可执行的权限。

  • S_IRWXO 00007权限,代表其他用户具有可读、可写及可执行的权限。

  • S_IROTH 00004权限,代表其他用户具有可读的权限。

  • S_IWOTH 00002权限,代表其他用户具有可写入的权限。

  • S_IXOTH 00001权限,代表其他用户具有可执行的权限。







推荐阅读

>>>新手必备-Linux入门之云计算是什么

>>>红帽认证入门-Linux系统介绍及企业版本选型

>>>新手必备-Linux系统安装配置+Xshell远程连接

>>>Linux常用命令行合集之绝对路径和相对路径

>>>软连接与硬连接



运维界升职加薪必备的云计算技术,你学了吗?

学完高级运维云计算课程之后,你可以:

  • 跨越90%企业的招聘硬门槛

  • 增加70%就业机会

  • 拿下BAT全国TOP100大厂敲门砖

  • 体系化得到运维技术硬实力

  • 技术大佬年薪可达30w+