你的位置:首页 > 操作系统

[操作系统]简介几种系统调用函数:write、read、open、close、ioctl

简介几种系统调用函数:write、read、open、close、ioctl ..._博客园

简介几种系统调用函数:write、read、open、close、ioctl 在Linux 中,一切(或几乎一切)都是文件,因此,文件操作在 Linux 中是十分重要的,为此,Linux 系...

应用层调用open,ioctl等系统调用后无法返回-CSDN论坛

4条回复nbsp;-nbsp;发帖时间:nbsp;2015年5月21日⋅ 应用层open(read、write、close)如何调用驱动open(read、write、close)函数...有密切的关系,理解它的成员有助于理解SPI设备节点的IOCTL命令,所以首...

系统调用与标准IO库区别 - sz_bb的博客 - CSDN博客

系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思...系统调用提供的函数如open, close, read, write, ioctl等 系统调用...

Linux-文件操作(open、write、read、close、iotcl) - f..._CSDN博客

Linux只需要少量函数就可以实现对文件和设备的访问和...Linux系统提供5个系统调用:open,write,read,close,io...ioctl: #include lt;unistd.hgt; int ioctl...

更多linux系统知识,楼主可以百度lt;linux就该这么学gt;.

这篇文章将先介绍Linux中文件的概念,系统调用和库函数的概念 ,然后具体的讨论两种...open、close、read、write和ioctl 通过调用这几个函数就能对Linux中的文件进行读...

ioctl函数详解 - CSDN博客

一、在用户空间,使用ioctl系统调用来控制设备,原型如下: int ioctl(int fd,unsigned...解析完 open、close、read、write 四个函数后,终于到我们的 io...

Linux的中应用程序如何使用系统调用系统调用_百度知道

回答:一般的驱动程序是不允许应用程序调用的,只有当驱动程序留出这种供外界访问的接口才行,这种接口一般包括read,write,open,ioctl等接口,如果驱动中...

读内核文档时遇到ioctl(2)、read(2)等,描述这些系统调..._CSDN论坛

⋅ 应用层open(read、write、close)如何调用驱动open(read、write、close)函数的? ⋅ Linux驱动设计ioctl函数的cmd参数不能为2 ⋅ 系统调用read,writ...

字符驱动之二操作方法(struct file_operations)-c..._ChinaUnix博客

中包含了用户空间所需要的大部分的系统调用函数指针,...几个重要的比如 open、read、write、ioctl、lseek ....(3)在最后的 close 关闭设备。3、read/w...

Linux音频编程指南

由ioctl系统调用来完成;最后,使用close系统调用告诉...如果open系统调用能够成功完成,它将返回一个正整数作为...无论是read还是write,一旦调用之后Lin...

Linux设备驱动程序学习笔记 - CodeWeblog.

设备驱动通常至少实现open,close,read,write系统调用...高级字符驱动程序操作--ioctl ioctl 驱动程序可以使用...

在内核模块中通过系统调用ioctl获取ATA/SCSI硬盘序列号 | 学步园

open, read, ioctl 这些系统调用本来是提供给用户空间的程序访问的,所以,对传递给它的参数,它默认会认为来自用户空间,在-gt;write()函数中,为了保护内核...

Linux管道和系统调用pipe()_Linux教程_Linux公社-Linux系统门户网站

故调用d_alloc()函数分配一个目录项,然后通过d_...ioctl: pipe_ioctl, open: pipe_read_open, release...release:pipe_write_release,}; 其中,bad_pip...

【引用】Linux下的声音编程方法 - Felix的日志 - 网易博客

下面介绍几个在进行音频编程时经常需要用到的技术指标...使用系统文件I/O处理函数(open、read、write、lseek...由ioctl系统调用来完成;最后,使用close...

Linux文件操作 - 简书

下面是用于访问设备驱动程序的底层函数(系统调用)。 open:打开文件或设备 read:...write:向文件或设备写数据 close:关闭文件或设备。 ioctl:把控制信息传递给设备...

strace工具跟踪系统调用 | 遗失的记忆

他会记录程序执行过程中调用的系统调用、接收到的信号。通 过查看记录,可以知道程序打开那些文件(open)、打开是否成功、对文件的操作(read,write,ioct...

基于嵌入式Linux与S3C2410平台的视频采集 - 消费电..._电子工程世界

这样当应用程序对设备文件进行诸如open、close、read、write等系统调用操作时,...在循环语句中,也是使用VIDIOCMCCAPTURE ioct1和VIDIOCSYNC ioctl函数...

【专利】一种基于零拷贝技术的高速网络数据包捕获方法_百度学术

范兵nbsp;,nbsp;薛鹏nbsp;-nbsp;nbsp;-nbsp;2011

初始化与该虚拟字符设 备对应的打开open方法、关闭close方法、控制ioctl方法、...数据包捕获程序调用get_read_n0des函数获取当前时刻R队列中的数据域控制 结构,...

剖析Linux系统调用的执行路径 – 前端开发,JQUERY特效,全栈开发,...

真正的系统调用,在Unix下,它是通过调用write函数来...sys_write, sys_open, sys_close, sys_waitpid, ...sys_lock, sys_ioctl, sys_ftl, sys_mpx, s...

Xiao Guangrong#39;s Tech Life – Enjoy Tech, Enjoy Life

(Write-after-Read,WAR)和写后写相关(Write-after...利用系统调用进入内核。 如果该系统调用的路径访问到...这个API最终会被kvm_arch_vcpu_ioctl_set_guest_...饶平绿岛山庄游玩攻略?绿岛山庄可以钓鱼吗?潮州绿岛山庄好玩吗?绿岛山庄游玩项目有哪些?紫莲森林度假村晚上有演出吗?潮州紫莲森林度假村节目介绍?中秋节去紫莲度假村有什么好玩的?潮州紫莲度假村晚上玩什么?紫莲森林度假村9月有什么活动?潮州紫莲森林度假村游玩攻略?紫莲森林度假村首届推广月活动时间?潮州紫莲森林度假村推广月活动攻略?北京出发朝鲜旅游 北京出发朝鲜旅游 北京出发朝鲜旅游 北京出发朝鲜旅游 北京出发朝鲜旅游 北京出发朝鲜旅游 北京出发旅游 北京出发旅游 北京出发旅游 北京出发旅游 北京出发旅游 北京出发旅游 北京出发欧洲 北京出发欧洲 北京出发欧洲 北京出发欧洲 北京出发欧洲 北京出发欧洲 北京出发欧洲旅游 北京出发欧洲旅游 北京出发欧洲旅游 北京出发欧洲旅游 北京出发欧洲旅游 北京出发欧洲旅游

  在 Linux 中,一切(或几乎一切)都是文件,因此,文件操作在 Linux 中是十分重要的,为此,Linux 系统直接提供了一些函数用于对文件和设备进行访问和控制,这些函数被称为系统调用(syscall),它们也是通向操作系统本身的接口。

一、系统调用

  系统调用就是 Linux 内核提供的一组用户进程与内核进行交互的接口。这些接口让应用程序受限的访问硬件设备,提供了创建新进程并与已有进程进行通信的机制,也提供了申请操作系统其他资源的能力。

  系统调用工作在内核态,实际上,系统调用是用户空间访问内核空间的唯一手段(除异常和陷入外,它们是内核唯一的合法入口)。系统调用的主要作用如下:

1)系统调用为用户空间提供了一种硬件的抽象接口,这样,当需要读写文件时,应用程序就可以不用管磁盘类型和介质,甚至不用去管文件所在的文件系统到底是哪种类型;

2)系统调用保证了系统的稳定和安全。作为硬件设备和应用程序之间的中间人,内核可以基于权限、用户类型和其他一些规则对需要进行的访问进行判断;

3)系统调用是实现多任务和虚拟内存的前提。

  要访问系统调用,通常通过 C 库中定义的函数调用来进行。它们通常都需要定义零个、一个或几个参数(输入),而且可能产生一些副作用(会使系统的状态发生某种变化)。系统调用还会通过一个 long 类型的返回值来表示成功或者错误。通常,用一个负的值来表明错误,0表示成功。系统调用出现错误时,C 库会把错误码写入 errno 全局变量,通过调用 perror() 库函数,可以把该变量翻译成用户可理解的错误字符串。

 

二、几种常用的系统调用函数 

2.1 write 系统调用

  系统调用 write 的作用是把缓冲区 buf 的前 nbytes 个字节写入与文件描述符 fildes 关联的文件中。它返回实际写入的字节数。如果文件描述符有错或者底层的设备驱动程序对数据块长度比较敏感,该返回值可能会小于 nbytes。如果函数返回值为 0,就表示没有写入任何数据;如果返回值为 -1,则表明 write 系统调用出现了错误,错误代码保存在全局变量 errno 里。 write 系统调用的原型如下:

#include <unistd.h>size_t write(int fildes,const void *buf,size_t nbytes);

  其中,size_t 是标准 C 库中定义的一个数据类型,实际上就是 unsigned int。

  fildes 是文件描述符,内核利用文件描述符来访问文件,它是一个非负的整数,当打开现存文件或者新建一个文件时,都会返回一个文件描述符。有多少文件描述符取决于系统的配置情况,当一个程序开始运行时,它一般有 3 个已经打开的文件描述符:标准输入 0;标准输出 1;标准错误 2

#include <unistd.h>#include <stdlib.h>#include <stdio.h>int main(){  size_t x = write(1,"my name is tongye!\n",20);  printf("you have writed %d words to the buffer\n",x);  exit(0);}/* 输出结果:my name is tongye!you have writed 20 words to the buffer*/

  这段代码简单演示了一下 write 系统调用函数的用法:从缓冲区 buffer 中读取前 20 个字节写入标准输出中,write 返回了实际写入的字节数。

 

2.2 read 系统调用

  系统调用 read 的作用是:从文件描述符 fildes 相关联的文件里读入 nbytes 个字节的数据,并把它们放到数据区 buf 中。它返回实际读入的字节数,这可能会小于请求的字节数。如果 read 调用返回 0,就表示没有读入任何数据,已到达了文件尾;如果返回 -1,则表示 read 调用出现了错误。read 系统调用的原型如下:

#include <unistd.h>size_t read(int fildes,void *buf,size_t nbytes);

  用一段代码演示一下用法:

#include <unistd.h>#include <stdlib.h>#include <stdio.h>int main(){  char buffer[30];  size_t x = read(0,buffer,30);  write(1,buffer,x);  exit(0);}/* 输出结果:hello ,my name is tongye!hello ,my name is tongye!*/

  这段代码使用 read 系统调用函数从标准输入读取 30 个字节到缓冲区 buffer 中去(输出结果中的第一行是从标准输入键入的),然后使用 write 系统调用函数将 buffer 中的字节写到标准输出中去。

 

2.3 open 系统调用

  系统调用 open 用于创建一个新的文件描述符。

#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>int open(const char *path,int oflags);int open(const char *path,int oflags,mode_t mode);  // oflags 标志为 O_CREAT 时,使用这种格式

  open 建立了一条到文件或设备的访问路径。如果调用成功,它将返回一个可以被 read、write 和其他系统调用使用的文件描述符。这个文件描述符是唯一的,不会与任何其他运行中的进程共享。在调用失败时,将返回 -1 并设置全局变量 errno 来指明失败的原因。

  使用 open 系统调用时,准备打开的文件或设备的名字作为参数 path 传递给函数,oflags 参数用于指定打开文件所采取的动作。oflags 参数是通过命令文件访问模式与其他可选模式相结合的方式来指定的,open 调用必须指定以下文件访问模式之一:

1)O_RDONLY:以只读方式打开;

2)O_WRONLY:以只写方式打开;

3)O_RDWR :以读写方式打开。

  另外,还有以下几种可选模式的组合( 用按位或 || 来操作 ):

4)O_APPEND:把写入数据追加在文件的末尾;

5)O_TRUNC:把文件长度设置为零,丢弃已有的内容;

6)O_CREAT:如果需要,就按照参数 mode 中给出的访问模式创建文件;

7)O_EXCL:与 O_CREAT 一起使用,确保调用者创建出文件。使用这个模式可以防止两个程序同时创建同一个文件,如果文件已经存在,open 调用将失败。

  当使用 O_CREAT 标志的 open 调用来创建文件时,需要使用有 3 个参数格式的 open 调用。其中,第三个参数 mode 是几个标志按位或后得到的,这些标志在头文件 sys/stat.h 中定义,如下:

标志说明标志说明标志说明
S_IRUSR 文件属主可读  S_IRGRP文件所在组可读  S_IROTH其他用户可读
S_IWUSR文件属主可写S_IWGRP文件所在组可写S_IWOTH其他用户可写
S_IXUSR文件属主可执行S_IWOTH文件所在组可执行S_IXOTH其他用户可执行

  用一个例子说明一下:

#include <unistd.h>#include <stdlib.h>#include <fcntl.h>int main(){  open("file",O_CREAT,S_IRUSR | S_IWGRP);  exit(0);}

  执行这段代码将在当前目录下创建一个名为 file 的文件,该文件对文件属主可读,对文件所在组可写,用 ls -l 命令查看如下:

  可以看到有一个名为 file 的文件,该文件就是使用 open 系统调用创建的,文件的权限为文件属主可读,文件所在组可写。

 

2.4 close 系统调用

   系统调用 close 可以用来终止文件描述符 fildes 与其对应文件之间的关联。当 close 系统调用成功时,返回 0,文件描述符被释放并能够重新使用;调用出错,则返回 -1。

#include <unistd.h>int close(int fildes);

 

2.5 ioctl 系统调用

  系统调用 ioctl 提供了一个用于控制设备及其描述符行为和配置底层服务的接口。终端、文件描述符、套接字甚至磁带机都可以有为它们定义的 ioctl。

#include <unistd.h>int ioctl(int fildes,int cmd,...);

  ioctl 对描述符 fildes 引用的对象执行 cmd 参数中给出的操作。

 

参考资料:

《Linux程序设计 第四版》