系统调用的一些函数
2017-08-07 09:19
330 查看
1、open() ----打开函数
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags, mode_t mode);
pathname:要打开或创建的文件名称。
flags:标志位,指定打开文件的操作方式。
mode:指定新文件的访问权限。(仅当创建新文件时才使用该参数)
返回值:若成功返回文件描述符,否则返回-1并设置变量errno的值。
flags的取值
基本取值:
O_RDOWRONLY:以只写方式打开文件。
O_RDWRNLY:以只读方式打开文件。
O_RDWR:以读写方式打开文件。
注意:上述三个常量必须指定且只能指定一个。
可选取值(部分):
O_CREAT:如果被打开的文件不存在,则自动创建这个文件。
O_EXCL:如果O_CREAT标志已经使用,那么当由pathname参数指定的文件已经存在时,open返回失败。
O_TRUNC:如果被打开的文件存在并且是以可写的方式打开的,则清空文件原有的内容。
O_APPEND:新写入的内容将被附加在文件原来的内容之后,即打开后文件的读写位置被置于文件尾。
2、read() -----读函数
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
Returns number of bytes read, 0 on EOF, or –1 on error
各参数及返回值的含义如下:
fd:要读取的文件的描述符。
buf:读取到的数据要放入的缓冲区。
count:要读取的字节数。
返回值:若成功返回读到的字节数,若已到文件结尾则返回0,若出错则返回-1并设置变量errno的值。
注意:
1. 这里的size_t是无符号整型,ssize_t是有符号整型。
2. buf指向的内存空间必须事先分配好。
使用read()时,可能遇到哪些情况?
返回值等于count
返回一个大于0小于count的值
返回0
阻塞
返回-1且errno的值为EINTR
返回-1且errno的值为EAGAIN
文件以阻塞方式进行操作
ssize_t ret;
while (len != 0 && (ret = read (fd, buf, len)) != 0) {
if (-1 == ret) {
if (EINTR == errno)
continue;
perror("read");
break;
}
len -= ret;
buf += ret;
}
其中:len初始值为要读取的字节数
文件以非阻塞方式进行操作
ssize_t nr;
start:
nr = read (fd, buf, len);
if (-1 == nr) {
if (EINTR == errno)
goto start;
if (EAGAIN == errno)
/* 处理其他事务,在恰当的时候再调用read */
else
/* 有错误发生,处理错误 */
}
errno如果是EINTR,可以再次进行读操作;如果是EAGAIN,表示要读取的文件现在没有可供读取的数据。
3、write() ---写入函数
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
Returns number of bytes written, or –1 on error
各参数及返回值的含义如下:
fd:要写入的文件的描述符。
buf:要写入的数据所存放的缓冲区。
count:要写入的字节数。
返回值:若成功返回已写的字节数,出错则返回-1并设置变量errno的值。
使用write()时,可能遇到哪些情况?
返回值等于count
返回一个大于0小于count的值
阻塞
返回-1且errno的值为EINTR
返回-1且errno的值为EAGAIN
返回-1且errno的值为EBADF
返回-1且errno的值为EFAULT
返回-1且errno的值为EPIPE
4、lseek()改变文件偏移量
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fildes, off_t offset, int whence);
Returns new file offset if successful, or –1 on error
其中,参数whence必需是以下三个常量之一:
SEEK_SET:将文件偏移量设置在距文件开始处offset个字节。
SEEK_CUR:将文件偏移量设置在其当前值加offset,offset可正可负。
SEEK_END:将文件偏移量设置为文件长度加offset,offset可正可负。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags, mode_t mode);
pathname:要打开或创建的文件名称。
flags:标志位,指定打开文件的操作方式。
mode:指定新文件的访问权限。(仅当创建新文件时才使用该参数)
返回值:若成功返回文件描述符,否则返回-1并设置变量errno的值。
flags的取值
基本取值:
O_RDOWRONLY:以只写方式打开文件。
O_RDWRNLY:以只读方式打开文件。
O_RDWR:以读写方式打开文件。
注意:上述三个常量必须指定且只能指定一个。
可选取值(部分):
O_CREAT:如果被打开的文件不存在,则自动创建这个文件。
O_EXCL:如果O_CREAT标志已经使用,那么当由pathname参数指定的文件已经存在时,open返回失败。
O_TRUNC:如果被打开的文件存在并且是以可写的方式打开的,则清空文件原有的内容。
O_APPEND:新写入的内容将被附加在文件原来的内容之后,即打开后文件的读写位置被置于文件尾。
2、read() -----读函数
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
Returns number of bytes read, 0 on EOF, or –1 on error
各参数及返回值的含义如下:
fd:要读取的文件的描述符。
buf:读取到的数据要放入的缓冲区。
count:要读取的字节数。
返回值:若成功返回读到的字节数,若已到文件结尾则返回0,若出错则返回-1并设置变量errno的值。
注意:
1. 这里的size_t是无符号整型,ssize_t是有符号整型。
2. buf指向的内存空间必须事先分配好。
使用read()时,可能遇到哪些情况?
返回值等于count
返回一个大于0小于count的值
返回0
阻塞
返回-1且errno的值为EINTR
返回-1且errno的值为EAGAIN
文件以阻塞方式进行操作
ssize_t ret;
while (len != 0 && (ret = read (fd, buf, len)) != 0) {
if (-1 == ret) {
if (EINTR == errno)
continue;
perror("read");
break;
}
len -= ret;
buf += ret;
}
其中:len初始值为要读取的字节数
文件以非阻塞方式进行操作
ssize_t nr;
start:
nr = read (fd, buf, len);
if (-1 == nr) {
if (EINTR == errno)
goto start;
if (EAGAIN == errno)
/* 处理其他事务,在恰当的时候再调用read */
else
/* 有错误发生,处理错误 */
}
errno如果是EINTR,可以再次进行读操作;如果是EAGAIN,表示要读取的文件现在没有可供读取的数据。
3、write() ---写入函数
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
Returns number of bytes written, or –1 on error
各参数及返回值的含义如下:
fd:要写入的文件的描述符。
buf:要写入的数据所存放的缓冲区。
count:要写入的字节数。
返回值:若成功返回已写的字节数,出错则返回-1并设置变量errno的值。
使用write()时,可能遇到哪些情况?
返回值等于count
返回一个大于0小于count的值
阻塞
返回-1且errno的值为EINTR
返回-1且errno的值为EAGAIN
返回-1且errno的值为EBADF
返回-1且errno的值为EFAULT
返回-1且errno的值为EPIPE
4、lseek()改变文件偏移量
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fildes, off_t offset, int whence);
Returns new file offset if successful, or –1 on error
其中,参数whence必需是以下三个常量之一:
SEEK_SET:将文件偏移量设置在距文件开始处offset个字节。
SEEK_CUR:将文件偏移量设置在其当前值加offset,offset可正可负。
SEEK_END:将文件偏移量设置为文件长度加offset,offset可正可负。
相关文章推荐
- 系统调用和系统库函数的一些基础知识
- 一些库函数、系统函数的调用
- 理解ATL中的一些汇编代码(通过Thunk技术来调用类成员函数)
- Android学习笔记(4)调用系统函数与Intent,打电话的例子
- Linux系统调用--fcntl函数详解
- Linux中mmap与munmap函数系统调用
- 系统调用Open()函数的内核追踪(下篇)
- File_operations结构----将驱动里的功能函数与系统调用关联起来
- Linux系统调用--ptrace函数详解
- 收集一些系统 api 函数
- 手机调用系统的拍照和裁剪功能,假设界面有输入框EditText,在一些手机会出现点击EditText会弹出输入法,却不能输入的情况。
- 指针 和引用 || 静态成员函数 || 虚函数 || 系统调用和库函数 ||
- 中断中处理延时及一些函数的调用规则(中断调i2c驱动有感)
- linux常用系统调用函数
- sbrk函数是不是系统调用,还是c标准库函数?
- Linux系统调用--getrlimit()与setrlimit()函数详解
- J2ME中调用系统API C函数
- 使用LD_PRELOAD 加系统调用 替换libc原有函数
- 关于Android开发调用系统相机拍照的 一些事
- Linux系统调用--getrlimit()与setrlimit()函数详解