cp命令的编写——浅谈系统调用
摘要:linux中cp命令的實現(xiàn),通過這個程序,我們需要了解系統(tǒng)調(diào)用耗費時間的方面,同時學會系統(tǒng)調(diào)用的錯誤處理機制。
本文來源:http://blog.csdn.net/trochiluses/article/details/11103523
?
#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<fcntl.h>#define BUFFERSIZE 4096 #define COPYMODE 644void oops(char *,char *); int main(int argc, char *argv[]) {int in_fd,out_fd,n_chars;char buf[BUFFERSIZE];if((in_fd=open(argv[1],O_RDONLY))==-1)oops("can't open ",argv[1]);if ((out_fd=creat(argv[2],COPYMODE))==-1){oops("cannot creat",argv[2]);}while((n_chars=read(in_fd,buf,BUFFERSIZE))>0){if((write(out_fd,buf,n_chars))!=n_chars){oops("write error to",argv[2]);}}if(n_chars==-1)oops("read err from",argv[1]);if(close(in_fd)==-1||close(out_fd)==-1)oops("fail to close","");return 0; }void oops(char *s1,char *s2) {fprintf(stderr,"Error : %s",s1);perror(s2);exit(1); }
 注意:
?
1)關于系統(tǒng)調(diào)用
read和write屬于初級讀寫函數(shù),也是系統(tǒng)調(diào)用;系統(tǒng)調(diào)用需要消耗大量時間。因為代碼執(zhí)行權(quán)會從用戶轉(zhuǎn)移到內(nèi)核,執(zhí)行內(nèi)核代碼是需要時間的。系統(tǒng)調(diào)用開銷巨大,因為系統(tǒng)調(diào)用需要特殊的內(nèi)存和堆棧環(huán)境,這些需要在系統(tǒng)調(diào)用之前建立好;系統(tǒng)調(diào)用之后又需要恢復這些環(huán)境。這種環(huán)境切換需要耗費大量時間。最好的方法就是建立緩沖區(qū),一次讀取大量數(shù)據(jù),避免多次進行系統(tǒng)調(diào)用。我們可以用這個思想來改造前一篇中的who。
2)系統(tǒng)調(diào)用的錯誤處理
一般約定,系統(tǒng)調(diào)用open,write,lseek在出錯時會返回值-1。另外,系統(tǒng)調(diào)用都有自己的錯誤集,以open為例,打開文件不存在,沒有讀的權(quán)限,打開文件太多等等。內(nèi)核通過全局變量errno來確定錯誤類型,其中哦功能error.h中規(guī)定了一些錯誤的宏。
a。可以根據(jù)errno來分別進行錯誤處理:
?
#include<error.h> extern int errno;int sample() {int fd; fd=open("file",O_RDONLY);if(fd==-1){printf("can not open file:");if(error== ENOENT)printf("there is no such file");if (error==INTR){ printf("interrupted while opening file");} ... } }
 b.顯示錯誤信息:
?
可以利用perror來通過error來尋找錯誤信息。
?
#include<error.h> extern int errno;int sample() {int fd; fd=open("file",O_RDONLY);if(fd==-1){perror("can not open file:");} }?
?
總結(jié)
以上是生活随笔為你收集整理的cp命令的编写——浅谈系统调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: [转]如何在.NET MVC中使用jQu
- 下一篇: EPSON ME office 700F
