linuxC库函数---open

本文详细解析了Linux系统中open()函数的使用方法,包括头文件包含、函数原型、返回值解释、参数含义及示例代码。介绍了如何通过不同的标志位进行文件的读写、创建、追加等操作,以及权限设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、头文件

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

2、函数原型

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

3、返回值

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

4、参数含义

第一个参数(pathname):
指向欲打开的文件路径字符
第二个参数(flags):打开参数的权限
1.O_RDONLY 只读打开。
2.O_WRONLY 只写打开。
3.O_RDWR 读、写打开。
4.O_APPEND 每次写时都加到文件的尾端。
5.O_CREAT 若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明该新文件的存取许可权位。
6.O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。
7.O_TRUNC 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。
8.O_NOCTTY 如果pathname指的是终端设备,则不将此设备分配作为此进程的控制终端。
9.O_NONBLOCK 如果pathname指的是一个F I F O、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。
10.O_NDELAY所产生的结果使I/O变成非阻塞模式(non-blocking),在读取不到数据或是写入缓冲区已满会马上return,而不会阻塞等待。
11.O_SYNC 使每次w r i t e都等到物理I / O操作完成。
12.O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。
13.O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接,则会令打开文件失败。
14.O_DIRECTORY 如果参数pathname 所指的文件并非为一目录,则会令打开文件失败。
第三个参数(mode):
参数mode:文件的权限,对于一个已经存在的文件,参数mode是没有用的,通常将其省略,因此这种情况下open调用只需两个参数

注意:(第二个参数)
(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时设置

5、举例

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) 
{
	printf ("write process pid: %d\n", getpid ());
 	char buf[64] = { 0 };
  	int n = 0;
  	while (1) 
  	{
    	if ((n = read (STDIN_FILENO, buf, 64)) > 0) 
		{
      		int fd = open ("data.txt", O_WRONLY|O_CREAT, 0664);
      		if (fd < 0) 
	  		{
        		perror ("open");
        		continue;
      		}   
	  	buf[n] = '\0';
      	write (fd, buf, n + 1); 
      	close (fd);
    	}   
  	}
  	return 0;
}
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main (void) 
{
  	char buf[64];
  	int i;

  	printf ("read process pid: %d\n", getpid());
  	int fd = open ("data.txt", O_RDONLY);
  	if (fd < 0) 
  	{
    	perror ("open");
    	return -1;
  	}
  	int len = 0;
	int last_len = 0;
  	while (1)
	{
  		if ((len = read(fd, buf, 64)) < 0) 
  		{
    		perror ("read");
    		close (fd);
    		return -2;
  		}
  		printf ("%s", buf);
  		lseek (fd, 0,SEEK_SET);
		sleep (5);
	}
	close (fd);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值