今天我们来看一下几个系统调用函数,以及他们的基本用法。
一、open
int open ( char *filename , int flags , mode_t mode );
open 函数将filename转换为一个文件描述符,并且返回描述符数字。返回的描述符总是在进程中当前没有打开的最小描述符。
①filename
文件名
②flags
O_RDONLY | 只读 |
O_WRONLY | 只写 |
O_RDWR | 可读可写 |
O_CREAT | 如果文件不存在,就创建它的一个空文件 |
O_TRUNC | 如果文件已经存在,就清空它 |
O_APPEND | 在每次写操作前,设置文件位置到文件的结尾处,也就是追加操作 |
flags参数也可以是一个或者更多位掩码的或,为写提供给一些额外的提示
③mode
mode参数制定了新文件的访问权限位
掩码 | 描述 |
S_IRUSR S_IWUSR S_IXUSR |
使用者(拥有者)能够读这个文件 使用者(拥有者)能够写这个文件 使用者(拥有者)能够执行这个文件 |
S_IRGRP S_IWGRP S_IXGRP |
拥有者所在组的成员能够读这个文件 拥有者所在组的成员能够写这个文件 拥有者所在组的成员能够执行这个文件 |
S_IROTH S_IWOTH S_IXOTH |
其他人(任何人)能够读这个文件 其他人(任何人)能够读写这个文件 其他人(任何人)能够执行这个文件 |
下面的函数说明如何以读的方式打开一个已存在的文件
int fd=open("foo.txt",O_RDONLY,0);
下面的函数说明如何打开一个已存在的文件,并在后面添加一些数据
int fd=open("foo.txt",O_WRONLY|O_APPEND,0);
下面的函数经常用作创建一个新文件
int fd=open("foo.txt",O_CREAT|O_TRUNC|O_WRONLY,0);
二、read、write
ssize_t read ( int fd , void *buf , size_t n );
read函数从描述符为fd的当前文件位置复制最多n个字节到内存位置buf。返回值-1表示一个错误,而返回值0表示EOF。否则,返回值表示的实际传送的字节数量。
ssize_t write ( int fd, const void *buf , size_t n );
write函数从内存位置buf复制最多n个字节到描述符fd的当前文件位置。
下面的程序使用read和write调用一次一个字节的从标准输入(键盘)复制到标准输出(屏幕)。
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
char c;
while(read(STDIN_FILENO,&c,1)!=0)
write(STDOUT_FILENO,&c,1);
exit(0);