函数简介篇——系统调用函数

说明
  本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
  QQ 群 号:513683159 【相互学习】
内容来源
  《Unix环境高级编程》、man 手册

文件描述符

  打开/创建的文件均通过文件描述符引用,即文件标识符.
  文件描述符为非负整数,范围:0~OPEN_MAX
  标准文件描述符(定义于:unistd.h):
    ①STDIN_FILENO = 0 = 标准输入
    ②STDOUT_FILENO = 1 = 标准输出
    ③STDERR_FILENO = 2 = 标准错误
  

(1)open() —— 打开或创建文件

  1.函数功能:打开或创建一个文件

项目 说明
函数原型 int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
头文件 sys/types.h、sys/stat.h、fcntl.h
参数说明 pathname:文件名
flags:选项
(一个或多个或运算)
mode:访问权限位
返回值 一个文件描述符(小的非负整数值)
注意

2.flags常见选项:定义于:fcntl.h(还有很多)

flags 功能
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读、写打开
O_APPEND 每次写时都追加到文件尾端
O_CREAT 若文件不存在则创建,需mode指定新文件的访问权限位。
(2)creat() —— 创建文件

  1.函数功能:相当于调用带有O_CREAT|O_WRONLY|O_TRUNC标志的open()。

项目 说明
函数原型 int creat(const char *pathname, mode_t mode);
头文件 sys/types.h、sys/stat.h、fcntl.h
参数说明 pathname:文件名
mode:访问权限位
返回值 一个文件描述符(小的非负整数值)
注意
(3)read() —— 读取文件

  1.函数功能:尝试从文件描述符fd读取字节数count到从buf开始的缓冲区中。

项目 说明
函数原型 ssize_t read(int fd, void *buf, size_t count);
头文件 unistd.h
参数说明 fd:文件描述符
指向已打开文件的句柄
buf:缓冲区
指向一块用于存储的内存区域
count:字节数
调用一次read,读取的字符个数
返回值 成功返回读取到的字节数(0表示结束),
失败返回-1,并设置errno。
注意 对于支持寻址的文件,读取操作从文件偏移量开始,文件偏移量由读取字节数加1。
(4)write() —— 写入文件

  1.函数功能:将count字节的缓冲区buf写入到文件描述符fd所引用的文件。

项目 说明
函数原型 ssize_t write(int fd, const void *buf, size_t count);
头文件 unistd.h
参数说明 fd:文件描述符
指向已打开文件的句柄
buf:缓冲区
指向一块用于存储的内存区域
count:字节数
调用一次read,读取的字符个数
返回值 成功返回读取到的字节数(0表示结束),
失败返回-1,并设置errno。
注意 对于可查找的文件,在文件的偏移量处进行写入,并且文件偏移量增加实际写入的字节数。
(5)lseek()——重新定位文件偏移量

  1.函数功能:每打开文件都有其相关联的“当前文件偏移量”(除指定O_APPEND外默认为0),lseek()将与文件描述符fd相关联的文件偏移量依据whence重新定位到offset.

项目 说明
函数原型 off_t lseek(int fd, off_t offset, int whence);
头文件 sys/types.h、unistd.h>
参数说明 fd:文件描述符
指向已打开文件的句柄
offset:偏移量
(与whence相关)
whence:选项
SEEK_SET、SEEK_CUR 、SEEK_END
返回值 成功返回新文件偏移量,
失败返回-1,并设置errno。
注意

  2.offset与whence的关系
    SEEK_SET:文件偏移量设置为距文件开始处偏移offset字节。
    SEEK_CUR: 文件的偏移量设置为其当前位置加上偏移量offset字节。
    SEEK_END :文件偏移量设置为文件大小加上偏移量offset字节。

(6)close()—— 关闭文件

  1.函数功能:关闭一个文件

项目 说明
函数原型 nt close(int fd);
头文件 unistd.h
参数说明 fd:文件描述符
指向已打开文件的句柄
返回值 成功返回0,
失败返回-1,并设置errno。
注意 关闭文件时还会释放该进程加载该文件上的所有记录锁
dup()、dup2()与dup3()——复制文件描述符

  1.函数功能:系统调用创建文件描述符oldfd的副本,使用新描述符中编号最少的未使用的文件描述符

项目 说明
函数原型 int dup(int oldfd);
int dup2(int oldfd, int newfd);
int dup3(int oldfd, int newfd, int flags);
头文件 unistd.h
参数说明 oldfd:文件描述符
newfd:文件描述符
(指定文件描述符)
flags:标记
返回值 成功返回当前可用文件描述符中的最小数值,
失败返回非零
注意 dup(fd) = fcntl(fd,F_DUPFD,0)
dup3(fd,fd2) = close(df); fcntl(fd,F_DUPFD,fd2);
fgetc()、fgets()、getc()、getchar()、ungetc()——输入字符和字符串
函数 函数原型与功能描述 参数说明 头文件 返回值 注意
fgetc() int fgetc(FILE *stream);
从流中读取下一个字符,并将其作为无符号字符转换为int型
stream:文件流
s:缓冲区
size:字节大小
c:整型变量
stdio.h fgetc()、getc()和getchar()返回读取字符并转换为int类型。
fgets()成功返回s,失败时返回NULL;
ungetc()成功返回c,在错误时返回EOF。
fgets() char *fgets(char *s, int size, FILE *stream);
最多从流中读取一个小于size的字符,并将其存储到s所指向的缓冲区中
getc() int getc(FILE *stream);
与fgetc()等价
getchar() int getchar(void);
与getc()等价
ungetc() int ungetc(int c, FILE *stream);
将c推回stream,转换为unsigned char,在这里它可用于后续的读操作
sync()、fsync()、fdatasync() ——缓冲区与磁盘同步

  1.函数功能:将文件系统缓存提交到磁盘,保证磁盘上实际文件系统与缓冲区高速缓存中内容一致。

函数 函数原型与功能描述 参数说明 头文件 返回值 注意
sync() void sync(void);
仅将所有修改过块缓冲区排入写队列后返回,并不等待实际写磁盘结束
fd:文件描述符
unistd.h sync()总是成功

成功返回0,失败返回-1,并设置errno。
syncfs() int syncfs(int fd);
类似sync(),但只同步包含被打开的文件描述符fd引用的文件的文件系统。
fsync() int fsync(int fd);
仅对fd文件起作用,并等待磁盘操作结束后返回
fdatasync() int fdatasync(int fd);
类似fsync(),但只影响文件数据部分,fsync(),还会同步属性
fcntl()——控制文件描述符

  1.函数功能:对打开的文件描述符fd执行操作。该操作由cmd决定。

项目 说明
函数原型 int fcntl(int fd, int cmd, ... /* arg */ );
头文件 unistd.h、fcntl.h
参数说明 fd:文件描述符
cmd:命令选项
... :可选参数
返回值 成功返回0,
失败返回非零
注意

  2.cmd选项

flags 功能
F_DUPFD 复制文件描述符fd
F_GETFD 将fd文件描述符作为函数值返回
F_SETFD 对fd设置文件描述符标志
F_GETFL 对应fd文件状态标志作为函数值返回
F_SETFL 将文件状态标志设置为第三个参数值
F_GETOWN 取当前接收SIGIO和SIGURG信号的进程ID或进程组ID
F_SETOWN 设置接收SIGIO和SIGURG信号的进程ID或进程组ID

在这里插入图片描述

ioctl()——控制装置

  1.函数功能:操作特殊文件的底层设备参数。特别是,字符特殊文件(例如,终端)的许多操作特征可以用ioctl()请求来控制。

项目 说明
函数原型 int ioctl(int fd, unsigned long request, ...);
头文件 sys/ioctl.h
参数说明 fd:文件描述符
request:依赖于设备的请求代码
...:可选参数
(通常为指针)
返回值 成功返回0,
失败返回-1,并设置errno。
注意
stat()、fstat()、lstat()——获取文件状态

  1.函数功能

函数 函数原型与功能描述 参数说明 头文件 返回值 注意
stat() int stat(const char *pathname, struct stat *statbuf);
返回pathname命名文件有关的信息结构
pathname:路径名
statbuf:结构体指针
fd:文件描述符

sys/types.h、sys/stat.h、unistd.h
成功返回0,失败返回-1,并设置errno。
fstat() int fstat(int fd, struct stat *statbuf);
返回fd文件相关信息
lstat() int lstat(const char *pathname, struct stat *statbuf);
与stat()类似,返回符号链接相关信息

  2.stat结构体

struct stat {
               dev_t     st_dev;         /* ID of device containing file */
               ino_t     st_ino;         /* Inode number */
               mode_t    st_mode;        /* File type and mode */
               nlink_t   st_nlink;       /* Number of hard links */
               uid_t     st_uid;         /* User ID of owner */
               gid_t     st_gid;         /* Group ID of owner */
               dev_t     st_rdev;        /* Device ID (if special file) */
               off_t     st_size;        /* Total size, in bytes */
               blksize_t st_blksize;     /* Block size for filesystem I/O */
               blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */

               /* Since Linux 2.6, the kernel supports nanosecond
                  precision for the following timestamp fields.
                  For the details before Linux 2.6, see NOTES. */

               struct timespec st_atim;  /* Time of last access */
               struct timespec st_mtim;  /* Time of last modification */
               struct timespec st_ctim;  /* Time of last status change */

           #define st_atime st_atim.tv_sec      /* Backward compatibility */
           #define st_mtime st_mtim.tv_sec
           #define st_ctime st_ctim.tv_sec
           };

access()——检查文件权限

  1.函数功能:检查用户对文件的权限

项目 说明
函数原型 int access(const char *pathname, int mode);
头文件 unistd.h
参数说明 pathname:文件路径
mode:模式选项
返回值 成功返回0,
失败返回-1,并设置errno。
注意

  2.mode常量

mode 说明
R_OK 测试读权限
W_OK 测试写权限
X_OK 测试执行权限
F_OK 测试文件是否存在
umask()——设置文件模式创建掩码

  1.函数功能:调用进程的文件模式创建掩码(Umask)设置为mask & 0777(即,只使用掩码的文件权限位)

项目 说明
函数原型 mode_t umask(mode_t mask);
头文件 sys/types.h、sys/stat.h
参数说明 mask:掩码常量
返回值 返回之前的掩码值
注意

在这里插入图片描述

chmod()、fchmod()——改变文件权限

  1.函数功能chmod()在指定文件上进行操作,fchmod()对已打开文件进行操作。

项目 说明
函数原型 int chmod(const char *pathname, mode_t mode);
int fchmod(int fd, mode_t mode);
头文件 sys/stat.h
参数说明 pathname:文件路径名
fd:文件描述符
mode:模式
返回值 成功返回0,

在这里插入图片描述

chown()、 fchown()、lchown()——更改文件的所有权

  1.函数功能
    chown()改变路径名指定的文件的所有权,如果是符号链接则解除引用。
    fchown()改变被打开的文件描述符fd引用的文件的所有权。
    lchown()类似于chown(),但不解除对符号链接的引用。

项目 说明
函数原型 int chown(const char *pathname, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *pathname, uid_t owner, gid_t group);
头文件 unistd.h
参数说明 pathname:文件路径名
fd:文件描述符
owner:
group:
返回值 成功返回0,
失败返回-1,并设置errno。
注意
truncate()、ftruncate() —— 将文件截断为指定的长度

  1.函数功能:由path命名或fd引用的常规文件被截断为精确长度字节的大小。
    如果先前的文件大于这个大小,那么额外的数据就会丢失。如果先前的文件较短,则对其进行扩展,扩展的部分读取为空字节(‘\0’)。

项目 说明
函数原型 int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
头文件 unistd.h、sys/types.h
参数说明 path:文件路径名
fd:文件描述符
length:长度
返回值 成功返回0,
失败返回-1,并设置errno。
注意
link() ——为文件创建一个新名称(硬链接)

  1.函数功能:创建一个到现有文件的新链接(也称为硬链接)。如果newpath存在,它将不会被覆盖。

项目 说明
函数原型 int link(const char *oldpath, const char *newpath);
头文件 unistd.h
参数说明 oldpath:旧文件路径名
newpath:新文件路径名
返回值 成功返回0,
失败返回-1,并设置errno。
注意
unlink() —— 删除一个名称,可能还包括它引用的文件

  1.函数功能:从文件系统中删除一个名称。如果该名称是文件的最后一个链接,并且没有进程打开该文件,则该文件将被删除,并且它所使用的空间可以重用。

项目 说明
函数原型 int unlink(const char *pathname);
头文件 unistd.h
参数说明 pathname:文件路径名
返回值 成功返回0,
失败返回-1,并设置errno。
注意
remove() —— 删除一个文件或目录【man 3 remove】

  1.函数功能:【库函数调用】从文件系统中删除一个名称。对文件=unlink(2),对目录调用=rmdir(2)

项目 说明
函数原型 int remove(const char *pathname);
头文件 stdio.h
参数说明 pathname:文件路径名
返回值 成功返回0,
失败返回-1,并设置errno。
注意
rename()——更改文件的名称或位置

  1.函数功能:重命名一个文件,如果需要的话可以在不同的目录之间移动它。

项目 说明
函数原型 int rename(const char *oldpath, const char *newpath);
头文件 stdio.h
参数说明 oldpath:旧文件路径名
newpath:新文件路径名
返回值 成功返回0,
失败返回-1,并设置errno。
注意
symlink() —— 为文件创建一个新名称(软链接)

  1.函数功能:为target创建一个名为linkpath的符号链接,其中包含字符串目标。

项目 说明
函数原型 int symlink(const char *target, const char *linkpath);
头文件 unistd.h
参数说明 target:旧文件路径名
linkpath:新文件路径名
返回值 成功返回0,
失败返回-1,并设置errno。
注意
readlink() —— 读取符号链接的内容

  1.函数功能:将符号链接路径名的内容放在缓冲区buf中,缓冲区的大小为bufsizreadlink()不会向buf追加空字节。如果缓冲区太小无法容纳所有的内容,它将(静默地)截断内容(以buffsiz字符的长度)。

项目 说明
函数原型 ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
头文件 unistd.h
参数说明 pathname:文件路径名
buf:缓冲区
bufsiz:缓冲区大小
返回值 成功返回0,
失败返回-1,并设置errno。
注意
utime()——更改文件的最后访问和修改时间

  1.函数功能:将filename指定的inode的访问和修改时间分别更改为timesactimemodtime字段。若timesNULL,则文件的访问和修改次数设置为当前时间。

项目 说明
函数原型 int utime(const char *filename, const struct utimbuf *times);
头文件 sys/types.h、utime.h
参数说明 filename:文件名
times:结构体指针
返回值 成功返回0,
失败返回-1,并设置errno。
注意

  2.utimbuf结构体

 struct utimbuf {
               time_t actime;       /* access time */
               time_t modtime;      /* modification time */
           };

  3.每个文件相关的三个时间值
在这里插入图片描述

mkdir() —— 创建一个目录

  1.函数功能:尝试创建一个名为pathname的空目录。(...目录项是自动创建,文件访问权限由·mode`决定)

项目 说明
函数原型 int mkdir(const char *pathname, mode_t mode);
头文件 sys/stat.h、sys/types.h
参数说明 pathname:文件路径名
mode:目录的模式
返回值 成功返回0,
失败返回-1,并设置errno。
注意
rmdir() —— 删除一个目录

  1.函数功能:删除目录,该目录必须为空。

项目 说明
函数原型 int rmdir(const char *pathname);
头文件
参数说明 pathname:文件目录名
返回值 成功返回0,
失败返回-1,并设置errno
注意
opendir()、readdir()、rewinddir()、closedir()、telldir()、seekdir()【man 3 】

  1.函数功能

函数 函数原型与功能描述 参数说明 头文件 返回值 注意
opendir() DIR *opendir(const char *name);
打开与目录名对应的目录流,并返回指向目录流的指针。流定位在目录中的第一个条目上
name:目录名
dirp:目录流结构体指针
loc:调用telldir(3)时返回的值。
sys/types.h
dirent.h
看数据类型

成功返回指向目录流的指针,失败返回NULL,并设置errno。

成功返回0,失败返回-1,并设置errno

成功返回目录流中的当前位置,失败返回-1
readdir() struct dirent *readdir(DIR *dirp);
返回一个指向不同结构的指针,该结构表示dirp所指向的目录流中的下一个目录项。它在到达目录流末尾或发生错误时返回NULL。
rewinddir() void rewinddir(DIR *dirp);
将目录流dirp的位置重置为目录的开头。
closedir() int closedir(DIR *dirp);
关闭与dirp关联的目录流。
telldir() long telldir(DIR *dirp);
返回与目录流dirp关联的当前位置。
seekdir() void seekdir(DIR *dirp, long loc);
设置下一个readdir(2)调用在目录流中的起始位置。

  2.dirent结构体

struct dirent {
               ino_t          d_ino;       /* Inode number */
               off_t          d_off;       /* Not an offset; see below */
               unsigned short d_reclen;    /* Length of this record */
               unsigned char  d_type;      /* Type of file; not supported
                                              by all filesystem types */
               char           d_name[256]; /* Null-terminated filename */
           };
chdir()、fchdir()——改变工作目录

  1.函数功能:将调用进程的当前工作目录更改为path中指定的目录。
    fchdir()chdir()相同;唯一的区别是这个目录是作为一个打开的文件描述符给出的。

项目 说明
函数原型 int chdir(const char *path);
int fchdir(int fd);
头文件 unistd.h
参数说明 path:文件名
fd:文件描述符
返回值 成功返回0,
失败返回-1,并设置errno
注意
getcwd() —— 获取当前工作目录

  1.函数功能:当前工作目录的绝对路径名复制到buf所指向的数组中,该数组的长度大小为size

项目 说明
函数原型 char *getcwd(char *buf, size_t size);
头文件 unistd.h
参数说明 buf:空间
size:大小
返回值 成功返回一个以空字符结束的字符串,该字符串包含一个绝对路径名,即调用进程的当前工作目录。
失败时,这些函数返回NULL,并设置errno来指示错误。错误时,buf所指向的数组的内容未定义。
注意
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值