- command > file 将输出重定向到file
- command < file 将输入重定向到file
- command >> file 将输出以追加的形式重定向到file
- n > file 将文件描述符n重定向到file
- n >> file 将文件描述符n以追加的形式重定向到file
- n >& m 将输出m和文件n合并
- n <& m 将输入n和文件m合并
- << tag 将开始tag标记和结束tag之间的内容作为输入
/***************************************************************
包含头文件: #include <fcntl.h>
函数原型: int open(char* path,int ofag,/*mode_t mode(可选参数)*/)
返回值: 若成功,返回文件描述符,若失败,则返回 -1
参数说明: char* path (path指的要是绝对路径名)
int ofag 头文件ofag里定义的常量可进行"或"运算得到新的ofag
ofag: O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读写打开
O_EXEC 只执行打开
O_SEARCH 只搜索打开(应用于目录)(目前大多系统不支持)
上面五个常量必须只能指定一个
可选常量: O_APPEND 每次写追加到文件结尾
O_CLOEXEC 把FD_CLOEXEC设为文件描述符标志
O_CREAT 文件不存在就创建它,需要用mode指定权限
O_DIRECTORY 若path引用的不是目录则出错
O_EXCL 若文件不存在,则创建它,测试和创建是原子操作,和文件同时指定时若文件已存在则出错。
.......................
其他参数暂未使用,不做过多说明,
***************************************************************/
用例:
3.3.c 编译为 a.out
1 #include <fcntl.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 int main()
6 {
7 int fd;
8 char filename[] = "open.txt";
9
10 if ((fd = open(filename,O_RDWR | O_CREAT)) == -1)
11 {
12 printf("open error");
13 exit(0);
14 }
15
16 printf("open.txt 文件描述符为: %d\n",fd);
17 exit(0);
18 }
将3.3.2.c编译为b.out
1 #include <fcntl.h>
2 #include <unistd.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5
6 #define BUFFSIZE 4096
7
8 int main()
9 {
10 int fd;
11 char buff[BUFFSIZE];
12 int n;
13 char filename[] = "open.txt";
14 if ((fd = open(filename,O_WRONLY | O_APPEND)) == -1)
15 {
16 printf("open error\n");
17 exit(0);
18 }
19
20 while ((n = read(STDIN_FILENO,buff,BUFFSIZE)) > 0)
21 if (write(fd,n) != n)
22 {
23 printf("write error\n");
24 exit(0);
25 }
26 }
执行以下命令,体验一下open吧
/**********************************************************
包含头文件: #include <fcntl.h>
函数原型: int creat(const char* path,mode_t mode);
函数功能: 创建文件,若文件已存在,则将文件长度截为0
返回值: 若成功,返回为只写打开的文件描述符,若出错,返回 -1
此函数等效于: open(path,O_WRONLY | O_CREATE | O_TRUNC,mode)
*********************************************************/
/*******************************************************
包含头文件: #include <unistd.h>
函数原型: int close(int fd);
函数说明: 关闭文件并释放该进程加在该文件上的所有记录锁
返回值: 若成功返回0,若出错,返回-1
*******************************************************/
/***************************************************
包含头文件: #include <unistd.h>
函数原型: off_t lseek(int fd,off_t offset,int where)
函数说明: int where可指定为:
SEEK_SET 表示fd指定文件偏移量距文件开始offset个字节
SEEK_CUR 表示fd指定文件偏移量距文件当前偏移量offset个字节
SEEK_END 表示fd指定文件偏移量距文件结尾offset个字节
返回值: 若成功,返回新的文件偏移量,若出错,返回-1
注:若fd指的是一个管道,FIFO或网络套接字,则lseek出错,返回-1,并将 errno设置为 ESPIPE
*****************************************************/
/*****************************************************
包含头文件: #include <unistd.h>
函数原型: ssize_t read(int fd,void* buf,size_t nbytes);
函数说明: 读取fd里数据
返回值: 读到的字节数,若到达文件尾,则返回0,出错返回-1
******************************************************/
/*********************************************************
包含头文件: #include <unistd.h>
函数原型: ssize_t write(int fd,const void* buf,size_t nbytes);
函数说明: 往fd里写入数据
返回值: 若成功,返回已写字节数,若出错,返回-1
********************************************************/
/*****************************************************
包含头文件: #include <unistd.h>
函数原型: int dup(int fd);
函数说明: 复制一个现有文件描述符
返回值: 若成功,返回新文件描述符,若出错,则返回-1
注: 该函数返回新文件描述符一定是当前可用文件描述符最小值
*****************************************************/
/*********************************************************
包含头文件: #include <unistd.h>
函数原型: int dup2(ind fd1,int fd2);
函数说明: 复制一个现有的文件描述符
注:可用fd2参数指定新描述符,若fd2已经打开,则先将其关闭,若fd1等于fd2,则dup2返回fd2而不关闭它
*******************************************************/
实验代码:3.3.3.c
1 #include <unistd.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <fcntl.h>
5
6 int main()
7 {
8 int fd;
9 char filename[] = "hello.txt";
10
11 if ((fd = open(filename,O_RDWR | O_CREAT)) == -1)
12 {
13 printf("open error");
14 exit(0);
15 }
16
17 printf("open hello.txt's fd is %d\n",fd);
18
19 int fd2;
20
21 if ((fd2 = dup(fd)) == -1)
22 {
23 printf("dup error");
24 exit(0);
25 }
26
27 printf("dup get fd2 is %d\n",fd2);
28
29 int fd3;
30
31 if ((fd3 = dup2(fd,10)) == -1)
32 {
33 printf("dup2 error");
34 exit(0);
35 }
36
37 printf("dup2 get fd3 is %d\n",fd3);
38 exit(0);
39 }
执行:
/********************************************************
包含头文件: #include <unistd.h>
函数名称: int fsync(int fd);
函数说明:只对文件描述符指定的文件起作用,并且等待写磁盘操作结束才返回(可用于数据库)
返回值: 若成功,返回0,返回-1
*********************************************************/
/***************************************************
包含头文件: #include <unistd.h>
函数名称: int fdatasync(int fd);
函数说明: 类似于fsync,但它只影响数据部分,而fsync还同步更新文件属性
*****************************************************/
/******************************************************
包含头文件 #include <unistd.h>
函数名称: void sync(void)
函数说明: 将修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写操作结束
*****************************************************/
/***************************************************
包含头文件: #include <fcntl.h>
函数名称: int fcntl(int fd,int cmd,…/*int arg*/);
函数说明: 有以下5种功能:
(1) 复制一个已有的描述符(cmd = F_DUPFD或F_DUPFD_CLOEXEC)
(2) 获取/设置文件描述符标志(cmd = F_GETFD/cmd = F_SETFD)
(3) 获取/设置文件状态标志(cmd = F_GETFL/cmd = F_SETFL)
(4) 获取/设置异步I/O所有权(cmd = F_GETOWN/cmd = F_SETOWN)
(5) 获取/设置记录锁(cmd = F_GETLK/cmd = F_SETLK/cmd = F_SETLKW)
*****************************************************/
用例3.4.c
1 #include <fcntl.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4
5 int main()
6 {
7 int fd;
8 char* pathname = "open.txt";
9
10 if ((fd = open(pathname,O_RDONLY | O_SYNC | O_NONBLOCK | O_CREAT)) == -1 )
11 {
12 printf("open error");
13 exit(0);
14 }
15
16 int flag;
17
18 if ((flag = fcntl(fd,F_GETFL)) == -1)
19 {
20 printf("fcntl error");
21 exit(0);
22 }
23
24 switch(flag & O_ACCMODE)
25 {
26 case O_RDONLY:
27 printf("只可读\n");
28 break;
29 case O_WRONLY:
30 printf("只可写\n");
31 break;
32 case O_RDWR:
33 printf("可读写\n");
34 break;
35 default:
36 printf("unknown mode\n");
37 }
38
39 if (flag & O_APPEND)
40 printf("追加模式\n");
41
42 if (flag & O_NONBLOCK)
43 printf("非阻塞模式\n");
44
45 if (flag & O_SYNC)
46 printf("等待写完成模式\n");
47 exit(0);
48 }
运行:
最后,还有些函数没详解会在后面章节同步。。。。