🔥博客主页: 我要成为C++领域大神
🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】
❤️感谢大家点赞👍收藏⭐评论✍️
本博客致力于分享知识,欢迎大家共同学习和交流。
touch
是一个常用的命令行工具,在 Linux 和类 Unix 系统中使用。它主要用于创建空文件或者修改文件的访问时间(atime)和修改时间(mtime)。
创建空文件:如果指定的文件不存在,touch
命令会创建一个空的文件。如果文件已经存在,touch
命令会更新文件的访问时间和修改时间。
touch filename
同时创建多个文件:touch
命令可以同时创建多个文件。
touch file1 file2 file3
指定时间:使用 -t
选项可以指定文件的访问时间和修改时间。
touch -t YYYYMMDDHHMM.SS filename
使用其他文件的时间戳:使用 -r
选项可以使用其他文件的时间戳来设置指定文件的时间戳。
touch -r reference_file filename
只更新时间戳:使用 -c
选项可以只更新文件的时间戳,而不创建新文件。
touch -c filename
我们将用Linux系统函数中的open实现简单的touch命令:创建空文件、同时创建多个文件。
先来了解一下open函数
open
1、功能:打开或创建一个文件。
2、头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
3、函数定义:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
4、返回值:成功返回新分配的文件描述符,出错返回-1并设置errno
5、参数说明:
① pathname参数是要打开或创建的文件名,可以是相对路径也可以是绝对路径。
② flags参数有一系列常数值可供选择,可以同时选择多个常数用按位或运算符连接起来,所以这些常
数的宏定义都以O_开头,表示or。
必选项:以下三个常数中必须指定一个,且仅允许指定一个。
O_RDONLY:只读打开
O_WRONLY:只写打开
O_RDWR:可读可写打开
以下可选项可以同时指定0个或多个,和必选项按位或起来作为flags参数。
O_APPEND:表示追加。如果文件已有内容,这次打开文件所写的数据附加到文件的末尾而不覆盖
原来的内容。
O_CREAT:若此文件不存在则创建它。使用此选项时需要提供第三个参数mode,表示该文件的访
问权限。
O_EXCL:如果同时指定了O_CREAT,并且文件已存在,则出错返回。
O_TRUNC:如果文件已存在,并且以只写或可读可写方式打开,则将其长度截断(Trun-cate)为
0字节。
O_NONBLOCK:对于设备文件,以O_NONBLOCK方式打开可以做非阻塞I/O(Nonblock I/ O)
③ mode指定文件权限,可以用八进制数表示,比如0644表示-rw-r--r--
那么了解完open函数之后,想要实现简单的touch命令,我们需要调用open函数int open(const char *pathname, int flags, mode_t mode);并将第二个参数设置为O_CREAT,文件不存在则创建。
如果同时创建多个文件的话,那么需要循环创建。
main函数的“参数”
在此之前,我们需要先了解一下main函数的参数。
main函数也是有参数的。
int main(int argc, char *argv[])
{
return 0;
}
char *argv[]:很明显,这是一个数组,char *类型的数组,数组内每个元素都是一个字符串
argc:数组的长度,即字符串的个数。
代表的是我们在终端输入命令时,读取到的命令的个数,按空格来区分。
例如一个简单的touch命令,argc=4,argv={"touch","aa","bb","cc"}。
函数实现
了解完原理之后,我们开始实现
第一步,需要判断命令是否合法,因为要创建文件至少需要两个参数(touch filename)
第二步,如果我们有多个文件则需要循环进行创建,需要用到for循环
第三步,open函数每建一个文件都会分配一个文件描述符,我们可以用返回值来判断是否创建成功
第四步,操作系统中可以打开的文件是有上限的,所以我们在创建之后,需要进行关闭。
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc,char * argv[]){
//1、判断命令是否合法
if(argc<2) return -1;
//2、循环创建文件
for(int i=1;i<argc;++i){
int fd=open(argv[i],O_CREAT,0777);
//3、根据文件描述符,判断是否创建成功
if(fd==-1){
printf("file %s created fail ",argv[i]);
continue;
//4、关闭打开的文件
close(fd);
}
}
return 0;
}
创建一个文件:
成功创建!
创建多个文件:
成功创建
默认掩码
为什么open函数的第三个参数,mode,我们传入的是0777,但是实际创建的确实0755?
因为系统有默认的掩码,对权限进行遮掩。我们在函数中用umask修改一下即可。
再次创建文件查看权限:
修改成功!