您的位置:首页 > 其它

系统调用的一些函数

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可正可负。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: