分类: C/C++
2012-06-05 22:08:31
1:write系统调用
系统调用write的作用是,把缓冲区buf的前nbytes字节写入到与文件描述符fildes关联的文件中,同时它会返回实际写入的字节数。如果返回0,就表示为写出任何数据;如果是-1,就表示在write系统调用中出现了错误,对应的错误码保存在全局变量errno中。
下面是write系统调用的原型:
#include
size_t write(int fildes, const void *buf, size_t nbytes);
(注意:当开始运行程序的时候,它一般会有三个已经打开的文件描述符,其中0代表标准输入,1代表标准输出,2代表标准错误输出。)
实例:
#include
int main(void)
{
if ((write(1,"Hello World !\n",14)) != 14)
write(2,"A write error is occoured !\n",28);
return 0;
}
测试结果:
lishuo@lishuo-Rev-1-0:~/test$ make
gcc -o test test.c
lishuo@lishuo-Rev-1-0:~/test$ ./test
Hello World !
2:read系统调用
系统调用read的作用是从文件描述符fildes相关联的文件里读入nbytes个字节的数据,把它们放到缓冲区buf中,并返回实际读入的字节书。如果返回0,表示未读入任何数据;如果返回-1,表示read调用出现问题。
下面是read函数调用原型:
#include
size_t read(int fildes, void *buf, size_t nbytes);
实例:
#include
int main(void)
{
char buf[128];
int nread;
nread = read(0, buf, 128);
if((write(1,buf,nread)) != nread)
write(2,"A error occured !",17);
return 0;
}
测试结果:
lishuo@lishuo-Rev-1-0:~/test$ make
gcc -o test test.c
lishuo@lishuo-Rev-1-0:~/test$ ./test
hello world !
hello world !
3:open系统调用
open系统调用创建了一条到文件或设备的访问路径,如果操作成功,它将返回一个文件描述符,read和write等系统调用就是使用该文件描述符对打开的文件进行操作。open调用成功时返回一个新的文件描述符,失败时返回-1.并设置errno指明失败的原因。
函数原型如下:
#include
int open(const char* pathname, int oflag);
int open(const char* pathname, int oflag, mode_t mode);
pathname为文件名,如“file.c”;
oflag表示open以什么方式打开该文件,其中O_RDONLY(只读),O_WRONLY(只写),O_RDWR(读写)为三种最常用的方式。其中如果设置了O_CREAT,open就会按照mode给出的访问模式创建文件。
mode为访问权限的初始值,这些标志在sys/stat.h中定义。例如open("myfile", O_CREAT, S_IRUSR | S_IWUSR | S_IXUUR),它的作用是创建一个myfile新文件,只有文件所有者具有读写和执行的权限。
实例:
#include
#include
#include
int main(void)
{
char buf;
int in, out;
// 以只读方式打开文件file.in,同时返回文件描述符
in = open("file.in", O_RDONLY);
// 以只写方式打开文件file.out,同时返回文件描述符
out = open("file.out", O_WRONLY);
// 将file.in的每个字节都写入到file.out中
while(read(in, &buf, 1) == 1)
write(out, &buf, 1);
return 0;
}
测试结果:
1:编译
lishuo@lishuo-Rev-1-0:~/test$ make
gcc -o test test.c
2:创建文件file.in和file.out
lishuo@lishuo-Rev-1-0:~/test$ man rm > file.in
lishuo@lishuo-Rev-1-0:~/test$ > file.out
lishuo@lishuo-Rev-1-0:~/test$ls -l file.in file.out
-rw-rw-r-- 1 lishuo lishuo 3949 6月 5 19:10 file.in
-rw-rw-r-- 1 lishuo lishuo 0 6月 5 19:11 file.out
3:执行
lishuo@lishuo-Rev-1-0:~/test$ ./test
lishuo@lishuo-Rev-1-0:~/test$ ls -l file.in file.out
-rw-rw-r-- 1 lishuo lishuo 3949 6月 5 19:10 file.in
-rw-rw-r-- 1 lishuo lishuo 3949 6月 5 19:11 file.out
lishuo@lishuo-Rev-1-0:~/test$ diff file.in file.out
4:close系统调用
close系统调用终止一个文件描述符fildes与其对应文件之间的关联,文件描述符被释放并能够重新使用。当返回0的时候,说明close调用成功,-1表示调用出错。
函数原型:
#include
int close(int fildes);
5:ioctl系统调用
ioctl提供了一个用于控制设备及其描述符行为和配置底层服务的接口。
函数原型:
#include
int ioctl(int fildes, int cmd, ...);
6:lseek系统调用
lseek系统调用对文件描述符fildes的读写指针进行设置,读写指针可以设置为文件中的某个绝对位置,也可以为相对位置。它返回从文件头到文件指针被设置出的字节偏移值,失败返回-1。
函数原型:
#include
#include
off_t lseek(int fildes, off_t offset, int whence);
fildes:文件描述符
offset:指定偏移位置
whence:可取下列值:SEEK_SET(绝对位置),SEEK_CUR(相对与当前位置的一个相对位置),SEEK_END(相对与文件尾的一个相对位置。)
off_t:定义在sys/stat.h中。
7:fstat系统调用
fstat系统调用返回与打开文件描述符相关的文件爱你的状态信息,该信息将会写到buf结构中,buf的地址以参数形式传递给fstat。
stat系统调用通过文件名返回状态信息;如果是一个符号链接的时候,lstat返回的是该符号链接本身的信息,而stat返回该链接指向文件的信息。
函数原型:
#include
#include
#include
int fstat(int fildes, struct stat *buf);
int stat(const char* path, struct stat *buf);
int lstat(const char* path, struct stat *buf);
8:dup和dup2系统调用
dup系统调用复制文件描述符fildes,返回一个新的描述符;
dup2系统调用通过明确指定目标描述符把一个文件描述符复制成另外一个。
函数原型:
#include
int dup(int fildes);
int dup2(int fildes, int fildes2);