C語言編寫 linux 下的 touch 命令

2021-09-18 07:10:57 字數 2424 閱讀 4585

用c語言實現linux 下 touch 命令的操作:

touch:建立檔案或者修改檔案或目錄的時間戳。

實現效果:

可新增三個引數:

-c : --no-create     do not create any files   不建立不存在的檔案

-a :  change only the access time      只修改檔案的訪問時間

-m : change only the modification time  只修改檔案的修改時間

涉及的函式:

1.getopt()函式:解析命令列引數

/*函式原型*/

#include int getopt(int argc, char * const ar**, const char *optstring);

extern char *optarg;

extern int optind, // 初始化值為1,下一次呼叫getopt時,從optind儲存的位置重新開始檢查選項。

extern int opterr, // 初始化值為1,當opterr=0時,getopt不向stderr輸出錯誤資訊。

extern int optopt; /*當命令列選項字元不包括在optstring中或者選項缺少必

要的引數時,該選項儲存在optopt中, getopt返回'?』。*/

2.open()

int open(constchar*pathname, int flags);    

int open(constchar*pathname, int flags, mode_t mode);

作用:開啟和建立檔案。返回值:成功則返回檔案描述符,否則返回 -1。

3.utimensat()

#include int utimensat(int dirfd, const char *pathname,const struct timespec times[2], intflags);
作用:utimensat是以納秒級的精度改變檔案的時間戳。utimensat()通過檔案的路徑(pathname)獲得檔案。

這個系統呼叫函式都是通過乙個時間陣列times來改變時間戳的,times[0]修改最後一次訪問的時間(access time),times[1]修改最後修改的時間 (modify time)。該時間陣列是由秒和納秒兩個部分組成,資料結構如下:

struct timespec ;
times[x].tv_sec = utime_omit;相應的時間戳不變,times[x].tv_sec = utime_now;相應的時間戳變成當前時間 

#include#include#include#include#include#include#include#include#include#include#define ch_atime 1

#define ch_mtime 2

/*定義建立檔案時的模式,此處對使用者,組,其他設定的許可權都是可讀可寫的*/

#define mode_rw_ugo (s_irusr | s_iwusr | s_irgrp | s_iwgrp | s_iroth | s_iwoth)

static int change_times;//標誌檔案access time和modify time 的改變情況

static bool no_creat; //如果有(-c) 選項,並且不存在命令列中輸入的檔名,則不建立

static struct timespec newtime[2];//當設定新的access time 和 modify time 的時候使用

static bool mytouch(const char *file)

if(change_times != (ch_atime | ch_mtime))

else

}ok = (utimensat(at_fdcwd,file,newtime,0) == 0);

return false;

}int main(int argc,char **ar**)

} if(change_times == 0)

newtime[0].tv_nsec = utime_now;

newtime[1].tv_nsec = utime_now;

if(optind == argc)

for(;optind < argc; ++optind)

exit(ok ? exit_success : exit_failure);

}

Linux下 C語言編寫 TCP Server

用c寫的,做了函式的封裝,記錄在此,方便查詢 server.h ifndef server h define server h define false 1 define true 0 int server init char server port 伺服器初始化 int wait accept i...

Linux下編寫執行C語言程式

1.gcc 1.c o 1.out 1.out命名 2.gcc lm 1.c a.out使用math.h中宣告的庫函式還有一點特殊之處,gcc命令列必須加 lm選項,因為數學函式位於libm.so庫檔案中 這些庫檔案通常位於 lib目錄下 lm選項告訴編譯器,我們程式中用到的數學函式要到這個庫檔案裡...

Linux下 使用C語言編寫who命令

在linux 下 who命令是查詢當前登入的每個使用者。who的預設輸出包括使用者名稱 終端型別 登入日期及遠端主機。如圖 我們man一下who,在聯機幫助裡可以看到,who命令是讀取 var run utmp檔案來得到以上資訊的。我們在man一下utmp,知道utmp這個檔案,是二進位制檔案,裡面...