系统调用的一些函数

来源:互联网 发布:我的邻居是exo网络剧 编辑:程序博客网 时间:2024/04/28 03:27

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可正可负。





原创粉丝点击