author:zengzhi
利用open 函数实现touch 命令
//author:zengzhi#include <stdio.h>#include <unistd.h>#include <fcntl.h>int main(int argc,char *argv[]){int fd;fd=open(argv[1],O_CREAT|O_RDWR,0777);if(fd<0){printf("cread %s file fail\n",argv[1]);return -1;}printf("cread %s file suceess,fd=%d\n",argv[1],fd);close(fd);return 0;}
gcc -o touch touch.c
其中:
1、open 函数:
open(char *, flag, mode)在fcntl.h文件中声明。函数的作用:创建或打开某个文件,参数:最多有三个参数;
第一个参数,char * 包含有文件名和路径
第二个参数:flag 打开文件的方式
第三个参数:mode 创建文件的权限。
打开一个文件,第三个参数没有。创建一个文件,需要有第三个参数
flag内容如下:
flag 功能
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_CREAT 创建一个文件
O_EXCL 如果使用O_CREAT时文件存在,则可返回错误消息。这一 参数可测试文件是否存在。
O_TRUNC 打开文件(会把已经存在的内容给删除)。
O_APPEND 追加方式打开文件(不会把已经存在的内容给删除)。
返回值:
成功:文件描述符,它是一个非负的正整数,即文件的ID号,相当于人的身份证号;
文件描述符中:0表示的标准输入,1表示标准输出, 2表示标准出错输出
出错:-1。
Open 函数创建文件时的权限是:
== mode & (~umask)
B111 111 111 & ~(B 000 010 010) = B 111 101 101
2、stdio.h 为输入输出的函数库
3、unistd.h为Linux/Unix系统中内置头文件,包含了许多系统服务的函数原型,例如read函数、write函数和getpid函数等。用man read 可以显示
其作用相当于windows操作系统的"windows.h",是操作系统为用户提供的统一API接口,方便调用系统提供的一些服务。
4、#include <fcntl.h>:访问权限、创建文件模式、非阻塞标记
5、umask 码存在,最终权限为创建权限减去umask 码的值。例如,创建777权限的文件,umask 为0022,创建的最终权限为555,umask 码中的0 为粘着位,作用是进程结束了文件还存在在内存中
6、使用diff 命令可以比较两个文件内容的差异,无差异则不返回。
//author:zengzhi#include <stdio.h>#include <unistd.h>#include <fcntl.h>int main(int argc,char *argv[]){int fd;fd=open("./a.c",O_APPEND|O_RDWR);if(fd<0){printf("cread a.c file fail\n");return -1;}printf("cread a.c file suceess,fd=%d\n",fd);close(fd);return 0;}
更换flag 尝试:
检验文件是否存在:文件存在时,创建失败并返回负值
使用man 2 open 查看头文件: