linux文件的系统调用

    对于Linux而言,所有对设备或文件的操作都是通过文件描述符进行的。当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数)。后续对文件的操作只需通过该文件描述符,内核记录有关这个打开文件的信息(file结构体)。
一个进程启动时,默认打开了3个文件,标准输入、标准输出、标准错误,对应文件描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),这些常量定义在unistd.h头文件中。


fileno:将文件指针转换为文件描述符
fdopen:将文件描述符转换为文件指针
下面是文件操作的系统调用:


1.open系统调用:
函数原型
int open(const char *path, int flags);
参数
path :文件的名称,可以包含(绝对和相对)路径
flags:文件打开模式
返回值:
打开成功,返回文件描述符;打开失败,返回-1


2.open系统调用:
函数原型
int open(const char *path, int flags,mode_t mode);
参数
path :文件的名称,可以包含(绝对和相对)路径
flags:文件打开模式
mode:  用来规定对该文件的所有者,文件的用户组及系 统中其他用户的访问权限
返回值:
打开成功,返回文件描述符;打开失败,返回-1


打开文件的方式:
O_RDONLY 打开一个供读取的文件
O_WRONLY 打开一个供写入的文件
O_RDWR 打开一个可供读写的文件
O_APPEND 写入的所有数据将被追加到文件的末尾
O_CREAT 打开文件,如果文件不存在则建立文件
O_EXCL 如果已经置O_CREAT且文件存在,则强制open() 失败
O_TRUNC 在open() 时,将文件的内容清空


访问权限:
S_IRUSR 文件所有者的读权限位
S_IWUSR 文件所有者的写权限位
S_IXUSR 文件所有者的执行权限位
S_IRWXU S_IRUSR | S_IWUSR | S_IXUSR
S_IRGRP 文件用户组的读权限位
S_IWGRP 文件用户组的写权限位
S_IXGRP 文件用户组的执行权限位
S_IRWXG S_IRGRP | S_IWGRP | S_IXGRP
S_IROTH 文件其他用户的读权限位
S_IWOTH 文件其他用户的写权限位
S_IXOTH 文件其他用户的执行权限位
S_IRWXO S_IROTH | S_IWOTH | S_IXOTH

3.close系统调用:
函数原型:int close(int fd);
函数参数:
fd :要关闭的文件的文件描述符
返回值:

如果出现错误,返回-1;调用成功返回0


4.read系统调用:
函数原型:
ssize_t read(int fd, void *buf, size_t count);
参数:
fd :想要读的文件的文件描述符
buf : 指向内存块的指针,从文件中读取来的字节放到这个内存块中
count : 从该文件复制到buf中的字节个数
返回值:
如果出现错误,返回-1;读文件结束,返回0;否则返回从该文件复制到规定的缓冲区中的字节数


5.write系统调用:
函数原型:
ssize_t write(int fd, const void *buf, size_t count);
函数参数:
fd:要写入的文件的文件描述符
buf: 指向内存块的指针,从这个内存块中读取数据写入 到文件中
count: 要写入文件的字节个数
返回值:如果出现错误,返回-1;如果写入成功,则返回写入到文件中的字节个数


6.ioctl 函数
ioctl用于向设备发控制和配置命令,有些命令也需要读写一些数据,但这些数据是不能用read/write读写的,称为Out-of-band数据。也就是说,read/write读写的数据是in-band数据,是I/O操作的主体,而ioctl命令传送的是控制信息,其中的数据是辅助的数据。例如,在串口线上收发数据通过read/write操作,而串口的波特率、校验位、停止位通过ioctl设置,A/D转换的结果通过read读取,而A/D转换的精度和工作频率通过ioctl设置。
#include <sys/ioctl.h>
int ioctl(int d, int request, ...);
d是某个设备的文件描述符。request是ioctl的命令,可变参数取决于request,通常是一个指向变量或结构体的指针。若出错则返回-1,若成功则返回其他值,返回值也是取决于request。


7.lseek系统调用:
功能说明:通过指定相对于开始位置、当前位置或末尾位置的字节数来重定位,这取决于 lseek() 函数中指定的位置
函数原型:off_t lseek (int  fd,    off_t offset,   int base);
函数参数:
fd:需要设置的文件描述符
offset:偏移量
base:偏移基位置
返回值:返回新的文件偏移值
base 表示搜索的起始位置,有以下几个值:(这些值定义在<unistd.h>)
base 文件位置
SEEK_SET 从文件开始处计算偏移
SEEK_CUR 从当前文件的偏移值计算偏移
SEEK_END 从文件的结束处计算偏移


8. opendir系统调用:
功能说明:打开一个目录
原型:DIR*  opendir(char *pathname);
返回值:
打开成功,返回一个目录指针
打开失败,则返回NULL


9.readdir系统调用:
功能说明:访问指定目录中下一个连接的细节
原型:struct  dirent*  readdir(DIR  *dirptr);
返回值:
返回一个指向dirent结构的指针,它包含指定目录中下一个连接的细节;
没有更多连接时,返回NULL


功能说明:关闭一个已经打开的目录
原型:int closedir (DIR  *dirptr);
返回值:调用成功返回0,失败返回-1


附目录信息结构体
struct dirent 
{
    ino_t     d_ino;       /* inode number */
    off_t      d_off;       /* offset to the next dirent */
    unsigned short d_reclen;    /* length of this record */
    unsigned char  d_type;      /* type of file; not supported
                                              by all file system types */
    char      d_name[256]; /* filename */
 };


10. mkdir系统调用:
功能说明:用来创建一个称为pathname的新目录,它的权限位设置为mode
原型:int  mkdir(char *pathname,mode_t mode);
返回值:调用成功返回0,失败返回-1


11.rmdir系统调用
功能说明:删除一个空目录
原型:int  rmdir(char *pathname);
返回值:调用成功返回0,失败返回-1


12.chmod系统调用
功能说明:用来改变给定路径名pathname的文件的权限位
原型:int  chmod (char *pathname, mode_t mode);
int  fchmod (int  fd, mode_t mode);
返回值:调用成功返回0,失败返回-1


13.chown系统调用
功能说明:用来改变文件所有者的识别号(owner id)或者它的用户组识别号(group ID)
原型:int  chown (char *pathname, uid_t owner,gid_t group);
      int  fchown (int  fd, uid_t owner,gid_t group);
返回值:调用成功返回0,失败返回-1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值