stdin-----0
stdout-----1
stderr-----2,,
头文件 | #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> |
函数 | int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); |
功能说明 | 两者都是用来打开或者创建文件,在打开或创建文件时可以制定文件的属性及用户的权限等各种参数。 需要注意的是:三参模式一般用于新建的文件 |
参数说明 | 参数 pathname 指向欲打开的文件路径字符串. 参数flags :打开文件后,所赋予的权限,选择时,可在下面的三者中选择一种(只可以是其中一种): O_RDONLY 以只读方式打开文件 O_WRONLY 以只写方式打开文件 O_RDWR 以可读写方式打开文件. 除了上述三种选择外:还可以使用 | 与下面选项配合使用 O_CREAT 若欲打开的文件不存在则自动建立该文件. O_EXCL 如果O_CREAT也被设置, 此指令会去检查文件是否存在. 文件若不存在则建立该文件, 否则将导致打开文件错误. 此外, 若O_CREAT 与O_EXCL 同时设置, 并且欲打开的文件为符号连接, 则会打开文件失败. O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机. O_TRUNC 若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0, 而原来存于该文件的资料也会消失. O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面. O_NONBLOCK 以不可阻断的方式打开文件,也就是无论有无数据读取或等待, 都会立即返回进程之中. O_NDELAY 同O_NONBLOCK. O_SYNC 以同步的方式打开文件. O_NOFOLLOW 如果参数pathname所指的文件为一符号连接, 则会令打开文件失败. O_DIRECTORY 如果参数pathname所指的文件并非为一目录, 则会令打开文件失败。 Mode:设置文件访问权限的初始值;只有在建立新文件时才会生效, 此外真正建文件时的权限会受到umask 值所影响, 因此该文件权限应该为 (mode-umaks). 该选项有如下的选择: S_IRWXU 00700 权限, 代表该文件所有者具有可读、可写及可执行的权限. S_IRUSR 或S_IREAD, 00400 权限, 代表该文件所有者具有可读取的权限. S_IWUSR 或S_IWRITE, 00200 权限, 代表该文件所有者具有可写入的权限. S_IXUSR 或S_IEXEC, 00100 权限, 代表该文件所有者具有可执行的权限. S_IRWXG 00070 权限, 代表该文件用户组具有可读、可写及可执行的权限. S_IRGRP 00040 权限, 代表该文件用户组具有可读的权限. S_IWGRP 00020 权限, 代表该文件用户组具有可写入的权限. S_IXGRP 00010 权限, 代表该文件用户组具有可执行的权限. S_IRWXO 00007 权限, 代表其他用户具有可读、可写及可执行的权限. S_IROTH 00004 权限, 代表其他用户具有可读的权限 S_IWOTH 00002 权限, 代表其他用户具有可写入的权限. S_IXOTH 00001 权限, 代表其他用户具有可执行的权限.
|
头文件 | #include <unistd.h> |
函数 | ssize_t read(int fd, void *buf, size_t count); |
功能说明 | read系统调用从文件描述符fd指向的文件中,读取count个字节到buf中。 返回值:如果read成功,则返回读到的字节数,如果已达到结尾,则返回0,出错返回-1 |
参数说明 | fd:文件描述符 buf:保存读入信息的缓存 count:要读取的字节数 |
头文件 | #include <unistd.h> |
函数 | ssize_t write(int fd, const void *buf, size_t count); |
功能说明 | write系统调用将buf所指向的缓冲区的count个字节内容写入fd指向的文件 返回值:如果write成功,则返回读到的字节数,出错返回-1 |
参数说明 | fd:文件描述符 buf:保存读入信息的缓存 count:要读取的字节数 |
头文件 | #include <unistd.h> |
函数 | int close(int fd); |
功能说明 | (1) 当使用完文件后若已不再需要则可使用 close()关闭该文件; (2) close()会让数据写回磁盘,并释放该文件所占用的资源.返回值:若文件顺利关闭则返回0, 发生错误时返回-1. |
参数说明 | 参数fd 为先前由open()或creat()所返回的文件描述词. |
注意:在进行IO操作的时候,应遵从谁打开谁关闭open()和close() / fopen()和fclose()应成对出现
头文件 | #include <sys/types.h> #include <unistd.h> |
函数 | off_t lseek(int fd, off_t offset, int whence); |
功能说明 | lseek系统调用用来移动读写指针的位置 返回值:调用成功时范围当前的读写位置,也就是距离文件开始处多少字节,若有错误返回-1 |
参数说明 | fd:要操作的文件 offset:相对whence移动的位移数,允许负值 whence:起始指针,它有三个取值 SEEK_SET 从文件开始处计算偏移量 SEEK_CUR 从文件指针的当前位置开始计算偏移量 SEEK_END 从文件结尾处开始计算偏移量文件指针值等于当前指针值加上offset的值。 |
将文件读写指针移动到文件开头:lseek(int fildes, 0, SEEK_SET);
将文件读写指针移动到文件结尾:lseek(int fildes, 0, SEEK_END);
获取文件读写指针当前的位置lseek(int fikdes, 0, SEEK_CUR);
<1>允许偏移的字节个数大于文件本身
<2>lseek()本身不进行读写操作
(5)dup()/dup2() 头文件 | #include <unistd.h> |
函数 | int dup(int oldfd); int dup2(int oldfd, int newfd); |
功能说明 | 两者均是用来实现文件的重定向文件描述符;但是有一定区别 (1) dup是非原子操作/dup2是原子操作 (2) (1) dup:传给该函数一个既有的描述符oldfd,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝。这意味着,这两个描述符共享同一个数据结构。 (3) dup2 与dup函数相似,但dup2函数允许调用者规定一个有效描述符oldfd和目标描述符的newfd。dup2函数成功返回时,目标描述符newfd将变成源描述符oldfd的复制品,换句话说,两个文件描述符现在都指向同一个文件,并且是函数第一个参数指向的文件。 |
参数说明 | 参数fd 为先前由open()或creat()所返回的文件描述词. |
头文件 | #include <unistd.h> |
函数 | Void sync(void); int fsync(int fd); int fdatasync(int fd); |
功能说明 | sync(2);//刷新缓存区到内核io队列,不阻塞 ; fsync(2);//阻塞,直到文件的数据和inode信息全部刷新在磁盘空间才会返回; 成功返回0,错误返回-1 并设置errno fdatasync(2);//阻塞,只是文件的数据刷新在磁盘空间才会返回; 成功返回0,错误返回-1 并设置errno |
参数说明 | 参数fd 为先前由open()或creat()所返回的文件描述词. |
头文件 | #include <unistd.h> #include <fcntl.h> |
函数 | int fcntl(int fd, int cmd, ... /* arg */ ); |
功能说明 | 功能描述:根据文件描述词来操作文件的特性。 |
参数说明 | 参数: |
头文件 | #include <sys/ioctl.h> |
函数 | int ioctl(int d, int request, ...); |
功能说明 | |
参数说明 | d就是用户程序打开设备时使用open函数返回的文件标示符; request就是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和request的意义相关的。 |
//创建一个新的文件,将标准输入重新定向到新创建的文件,
//使用write()想标准输入连续写入"LINUX 菜鸟\n",发现结果实际上是写到了新创建的文件fd中
/********************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
int fd,new;//定义一个文件描述符
char buf[1024] = "LINUX 菜鸟\n";
int i = 0;
if(argc <2){
printf("Useage.....");
exit(1);
}
fd = open(argv[1],O_WRONLY|O_CREAT,0666); //赋予创建/打开的文件权限
if(fd < 0){
perror("open()");
exit(1);
}
if((new = dup2(fd,1)) < 0){
perror("dip2()");
exit(1);
}
for(i=0;i<6;i++){
write(1,buf,1024); //向输出stout流输入字节
}
close(fd); //遵守谁打开谁关闭的原则
return 0;
}