Linux中open、write、read、close系统调用

open系统调用

 

open函数的三个参数:

(1)path是已经存在的文件的路径;

(2)oflags参数:若值为 O_RDONLY ,就以只读方式打开文件;

               若值为 O_WDONLY,就以只写方式打开文件;

               若值为 O_RDWR,就以读写方式打开文件;

(3)参数mode:文件的权限,对于一个已经存在的文件,参数mode是没有用的,通常将其省略,因此这种情况下open调用只需两个参数。

 

创建新文件:

 

   前面已经说到,当文件不存在时,open会创建一个新文件(仅能是普通文件),我们只需要用 or操作向open的 oflags参数中加入标志O_CREAT即可。这样可以创建一个新的只读文件,但是这没有任何意义,因为所创建的新文件没有任何可读内容。因此一般需要 O_CREAT与 O_WRONLY或 O_RDWR一起使用,此时就需要mode参数了。

   例如:

      int fd = open("/home/LY/newfile",O_RDWR | O_CREAT,MODE_FILE) 

      参数mode仅在创建新文件时有效,对于一个已经存在的文件,它没有任何作用。

 

关于open的flags参数:

 

   除了以上介绍的 open标志外,open还有许多标志,具体的如下表所示:

 

标志

解释

O_RDONLY

只读方式打开

O_WRONLY

只写方式打开

O_RDWR

读写方式打开

O_APPEND

每次写都追加到文件的尾端

O_CREAT

若文件不存在则创建文件

O_DSYNC

设置同步I/O方式

O_EXCL

如果文件已存在,则出错;必须与O_CREAT一起使用

O_NOCTTY

不将此设备作为控制终端

O_NONBLOCK

不等待命名管道或特殊文件准备好

O_RSYNC

设置同步I/O方式

O_SYNC

设置同步I/O方式

O_TRUNC

将其长度截短为0

 

write系统调用

write函数的三个参数:

(1)fildes: 文件描述符
(2)buf:指定写入数据的数据缓冲区
(3)nbytes:指定写入的字节数

 

函数返回值:

                 成功:已写的字节数

           -1 :出错

                      0:未写入任何数据

 

 

例子:

 

运行结果:

 

 

read系统调用

read函数的三个参数:

(1)fildes:文件描述符

(2)buf:指定读入数据的数据缓冲区

(3)nbytes:指定读入的字节数

 

函数返回值:

                  成功:已读的字节数

                       0:未读入任何数据

                      -1:出错

 

例子:

运行结果:

 

 

close系统调用

通过对 close进行分析,我们会发现close并没有做什么实质工作,它没有刷新任何内核缓冲区,而仅仅是使文件描述符可以重用。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言,使用系统调用openreadwrite需要包含头文件<fcntl.h>和<unistd.h>。 下面是一个简单的例子,展示如何使用这些系统调用来打开一个文件、读取其的内容并将其写入另一个文件: ```c #include <fcntl.h> #include <unistd.h> int main() { // 打开源文件 int source_fd = open("source.txt", O_RDONLY); if (source_fd == -1) { perror("open source.txt"); return 1; } // 打开目标文件 int dest_fd = open("dest.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644); if (dest_fd == -1) { perror("open dest.txt"); return 1; } // 读取源文件的内容并写入目标文件 char buffer[4096]; ssize_t bytes_read; while ((bytes_read = read(source_fd, buffer, sizeof(buffer))) > 0) { ssize_t bytes_written = write(dest_fd, buffer, bytes_read); if (bytes_written != bytes_read) { perror("write"); return 1; } } if (bytes_read == -1) { perror("read"); return 1; } // 关闭文件 if (close(source_fd) == -1) { perror("close source_fd"); return 1; } if (close(dest_fd) == -1) { perror("close dest_fd"); return 1; } return 0; } ``` 在这个例子,首先使用open打开源文件和目标文件,并检查是否成功打开。然后,使用read从源文件读取数据,使用write将数据写入目标文件。最后,使用close关闭文件。 需要注意的是,在readwrite,我们使用了一个缓冲区,大小为4096字节。这是为了避免频繁地进行系统调用,提高效率。此外,在open,我们使用了一些标志来指定文件的打开方式,例如O_RDONLY表示只读模式,O_WRONLY表示只写模式,O_CREAT表示文件不存在则创建,O_TRUNC表示在打开文件时将其截断为0字节。最后一个参数0644表示文件权限,其6表示读和写的权限,4表示只读权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值