首页 > 代码库 > Linux中open函数以及退出进程的函数

Linux中open函数以及退出进程的函数

open函数的flag详解1

读写权限:O_RDONLY O_WRONLY O_RDWR

(1)linux中文件有读写权限,我们在open打开文件时也可以附带一定的权限说明 (譬如O_RDONLY就表示以只读方式打开,O_WRONLY表示以只写方式打开, O_RDWR表示以可读可写方式打开)

(2)当我们附带了权限后,打开的文件就只能按照这种权限来操作。

打开存在并有内容的文件时:O_APPEND、O_TRUNC

(1)思考一个问题:当我们打开一个已经存在并且内部有内容的文件时会怎么样?

可能结果1:新内容会替代原来的内容(原来的内容就不见了,丢了)

可能结果2:新内容添加在前面,原来的内容继续在后面

可能结果3:新内容附加在后面,原来的内容还在前面

可能结果4:不读不写的时候,原来的文件中的内容保持不变

(2)O_TRUNC属性去打开文件时,如果这个文件中本来是有内容的,则原来的内容会被丢弃。这就对应上面的结果1

(3)O_APPEND属性去打开文件时,如果这个文件中本来是有内容的,则新写入的内容会接续到原来内容的后面,对应结果3

(4)默认不使用O_APPEND和O_TRUNC属性时就是结果4

(5)如果O_APPEND和O_TRUNC同时出现会怎么样?

exit、_exit、_Exit退出进程

(1)当我们程序在前面步骤操作失败导致后面的操作都没有可能进行下去时,应该在前面的错误监测中结束整个程序,不应该继续让程序运行下去了。

(2)我们如何退出程序

第一种;在main用return,一般原则是程序正常终止return 0,如果程序异常终止则return -1。

第二种:正式终止进程(程序)应该使用exit或者_exit或者_Exit之一。

open函数的flag详解2

打开不存在的文件时:O_CREAT、O_EXCL

(1)思考:当我们去打开一个并不存在的文件时会怎样?当我们open打开一个文件时如果这个文件名不存在则会打开文件错误。

(2)vi或者windows下的notepad++,都可以直接打开一个尚未存在的文件。

(3)open的flag O_CREAT就是为了应对这种打开一个并不存在的文件的。O_CREAT就表示我们当前打开的文件并不存在,我们是要去创建并且打开它。

(4)思考:当我们open使用了O_CREAT,但是文件已经存在的情况下会怎样?经过实验验证发现结果是报错。

(5)结论:open中加入O_CREAT后,不管原来这个文件存在与否都能打开成功,如果原来这个文件不存在则创建一个空的新文件,如果原来这个文件存在则会重新创建这个文件,原来的内容会被消除掉(有点类似于先删除原来的文件再创建一个新的)

(6)这样可能带来一个问题?我们本来是想去创建一个新文件的,但是把文件名搞错了弄成了一个老文件名,结果老文件就被意外修改了。我们希望的效果是:如果我CREAT要创建的是一个已经存在的名字的文件,则给我报错,不要去创建。

(7)这个效果就要靠O_EXCL标志和O_CREAT标志来结合使用。当这连个标志一起的时候,则没有文件时创建文件,有这个文件时会报错提醒我们。

(8)open函数在使用O_CREAT标志去创建文件时,可以使用第三个参数mode来指定要创建的文件的权限。mode使用4个数字来指定权限的,其中后面三个很重要,对应我们要创建的这个文件的权限标志。譬如一般创建一个可读可写不可执行的文件就用0666

 1 #include <stdio.h>
 2 #include <sys/types.h>
 3 #include <sys/stat.h>
 4 #include <fcntl.h>
 5 #include <unistd.h>
 6 #include <string.h>
 7 
 8 
 9 
10 int main(int argc, char *argv[])
11 {
12     int fd = -1;        // fd 就是file descriptor,文件描述符
13     char buf[100] = {0};
14     char writebuf[20] = "l love linux";
15     int ret = -1;
16     
17     // 第一步:打开文件
18     fd = open("a.txt", O_RDWR | O_APPEND | O_TRUNC);
19     if (-1 == fd)        // 有时候也写成: (fd < 0)
20     {
21         printf("文件打开错误\n");
22         // return -1;
23         _exit(-1);
24     }
25     else
26     {
27         printf("文件打开成功,fd = %d.\n", fd);
28     }
29 
30 #if 1    
31     // 第二步:读写文件
32     // 写文件
33     ret = write(fd, writebuf, strlen(writebuf));
34     if (ret < 0)
35     {
36         printf("write失败.\n");
37         _exit(-1);
38     }
39     else
40     {
41         printf("write成功,写入了%d个字符\n", ret);
42     }
43 #endif
44 
45 
46 #if 0
47     // 读文件
48     ret = read(fd, buf, 5);
49     if (ret < 0)
50     {
51         printf("read失败\n");
52         _exit(-1);
53     }
54     else
55     {
56         printf("实际读取了%d字节.\n", ret);
57         printf("文件内容是:[%s].\n", buf);
58     }
59 #endif    
60 
61     // 第三步:关闭文件
62     close(fd);
63     
64     _exit(0);
65 }

 

Linux中open函数以及退出进程的函数