linux文件函數
⑴ 在linux系統中如何用open函數創建文件
Linux操作系統內核(kernel)利用文件描述符來訪問文件,文件描述符大於等於0,是一個用戶描述被打開文件的索引值,它指向該文件的相關信息記錄表,當文件打開或者創建新文件的時,就會返回一個文件描述符,當讀寫文件時,也需要使用文件描述符來指定特寫文件。
2、講解open函數
文件需要先打開或則創建
如果返回是-1, 則出錯,如果成功,則返迴文件描述符
第一個參數是文件路徑
第二個參數是flags
⑵ Linux系統編程之程序的執行(exec函數族)
程序文件存儲在磁碟上,當系統需要執行程序時將其載入至內存中形成進程。我們程序員可以通過一些調用,使進程能以全新的程序來替換當前運行的程序。
Linux環境下使用exec()函數執行一個新的程序,該函數在文件系統中搜索指定路徑的文件,並將該文件內容復制到調用exec()函數的地址空間,碼賀取代原進程的內容。
exec()函數原型,如下遲改派(其實有很多,其實大部分使用方式都是大同小異的...)
參數其實很簡單,一個要pathname也就是要執行的程序的環境變數後面是這個程序的參數(系統自帶的可執行程序如,ls,cp,cat 等),另一個是要filename也就是要執殲改行的程序的文件名後面是這個程序的參數。
execlp():
execl()
⑶ Linux下是否有文件拷貝的庫函數
不管是哪種操作系統,要實現文件拷貝,必須陷入內核,從磁碟讀取文件內容,然後存儲到另一個文件。實現文件拷貝最通常的做法是:讀取文件用系統調用read()函數,讀取到一定長度的連續的用戶層緩沖區,然後使用write()函數將緩沖區內容寫入文件。也可以用標准庫函數fread()和fwrite(),但這兩個函數最終還是通過系統調用read()和write()實現拷貝的,因此可以歸為一類(不過效率肯定沒有直接進行系統調用的高)。一個更高級的做法是使用虛擬存儲映射技術進行,這種方法將源文件以共享方式映射到虛擬存儲器中,目的文件也以共享方式映射到虛擬地址空間中,然後使用memcpy高效地將源文件內容復制到目的文件中。點擊(此處)折疊或打開#include#include#include#include#include#include#include#include#include#include#defineerror(fmt,args)\printf(fmt,##args);\printf(":%s\n",strerror(errno))inlineintcp_rw(intsrcfd,intdstfd,char*buf,intlen);inlineintcp_map(intsrcfd,intdstfd,size_tlen);intmain(intargc,char**argv){charbuf[8192];intsrcfd,dstfd;clock_tstart,end;structtmsstm,ntm;structstatfilestat;inttck;charcmdline[30];if(argc!=3)printf("usage:cmd");tck=sysconf(_SC_CLK_TCK);start=times(&stm);if((srcfd=open(argv[1],O_RDONLY))==-1){error("open%serror",argv[1]);exit(0);}if((dstfd=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0666))==-1){error("creat%serror",argv[2]);exit(0);}fstat(srcfd,&filestat);if(lseek(dstfd,filestat.st_size,SEEK_SET)==-1){error("lseekerror");exit(0);}if(write(dstfd,"",1)!=1){error("writeerror");exit(0);}cp_map(srcfd,dstfd,filestat.st_size);close(srcfd);close(dstfd);end=times(&ntm);printf("ing%sto%susingcp_map:filesize=%luMBytesUsing%fseconds\n",argv[1],argv[2],filestat.st_size>>20,(end-start)/(double)tck);sprintf(cmdline,"rm-f%s",argv[2]);system(cmdline);return0;}inlineintcp_rw(intsrcfd,intdstfd,char*buf,intlen){intnread;while((nread=read(srcfd,buf,len))>0){if(write(dstfd,buf,nread)!=nread){error("writeerror");return-1;}}if(nread==-1){error("readerror");return-1;}return0;}inlineintcp_map(intsrcfd,intdstfd,size_tlen){char*src,*dst;if((src=mmap(0,len,PROT_READ,MAP_SHARED,srcfd,0))==MAP_FAILED){error("mmapsrcerror");return-1;}if((dst=mmap(0,len,PROT_WRITE,MAP_SHARED,dstfd,0))==MAP_FAILED){error("mmapdsterror");return-1;}if(memcpy(dst,src,len)==NULL){error("memcpyerror");return-1;}munmap(src,len);munmap(dst,len);return0;}運行,拷貝一個1.1G的文件,得到如下結果[root@garden]#.//home/ker.tgz./ker.tgzing/home/ker.tgzto./ker.tgzusingcp_map:filesize=1030MBytesUsing61.900000secondsing/home/ker.tgzto./ker.tgzusingcp_rw:filesize=1030MBytesUsing34.330000seconds使用read/write的方法居然比mmap的快一倍,這是怎麼回事呢?理論上mmap系統調用只進行了一次,而且拷貝文件是直接在內核空間進行的,read/write則需要通過系統調用把內核空間的緩存復制到用戶空間,再將用戶空間緩存復制到內核空間,拷貝次數明顯多了一個呢?速度為什麼於理論預測的不一致呢?
⑷ linux c用什麼函數創建文件夾
Linux c語言可以使用系統提供的mkdir函數來創建文件夾。
1、函數原型
int mkdir(const char *path, mode_t mode);
2、參數說明:
path是目錄名
mode是目錄許可權
3、需要頭文件
#include<sys/stat.h>
4、示例
//添加mkdir函數聲明頭文件
#include<sys/stat.h>
#include<sys/types.h>
intmain()//主函數
{
//直接調用mkdir函數
//建立一個名為的文件夾
//許可權為0777,即擁有者許可權為讀、寫、執行
//擁有者所在組的許可權為讀、寫、執行
//其它用戶的許可權為讀、寫、執行
mkdir("",0777);
return0;
}
說明:函數調用試圖建立777許可權的文件夾,但是在實際程序執行時,還需要考慮umask值,最終才會得到實際的許可權。
5、執行效果如下圖所示
說明:t.c是源碼文件,有gcc進行編譯,-o是gcc的參數,有於指明編譯後輸出的文件,t為源碼經gcc編譯後生成的可執行文件。./t是執行當前目錄下的生成的可執行文件t。
⑸ 小技巧之查看Linux系統函數頭文件
分享一個小技巧。
我們在寫Linux應用程序時,有時候記不清某個系統函數的頭文件,往往要麼網路,要麼查源碼,這樣做都不方便,費時費力。
其實,可以用一個命令搞定:man。
比如,我要查sleep函數的頭文件,在終端下敲命令: man sleep ,輸出信息:
並沒有發現頭文件!但是,請看紅框里的內容,意思是當前顯示的只是sleep手冊的第1頁,還有第3頁可以參考,繼續輸命令 man 3 sleep ,輸出信息:
看紅框中的內容,是不就看到sleep函數的頭文件及函數原型定義了!
查看read函數頭文件,同樣的,輸入 man read ,直接可以查到:
是不是很方便啊!!!