1,首先需要了解cp的原理。

成都創(chuàng)新互聯(lián)是一家專業(yè)提供華安企業(yè)網(wǎng)站建設,專注與成都網(wǎng)站設計、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設、HTML5建站、小程序制作等業(yè)務。10年已為華安眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。
2,可以參考cp的源碼去了解其原理
3,cp命令的源碼可以在linux內(nèi)核中找到。
4,或者下載busybox其中也會有cp的源碼
只有了解其原理之后才能談如何實現(xiàn)。參考代碼如下:
#include?stdio.h
#include?stdlib.h
#include?sys/stat.h
#include?sys/types.h
#include?fcntl.h
#include?errno.h
#include?unistd.h
#include?string.h
#define?BUF_SIZE?1024
#define?PATH_LEN?128
void?my_err(char?*err_string,?int?line?)
{
fprintf(stderr,"line:%d?",line);
perror(err_string);?
exit(1);
}
void?copy_data(const?int?frd,const?int?fwd)
{
int?read_len?=?0,?write_len?=?0;
unsigned?char?buf[BUF_SIZE],?*p_buf;
while?(?(read_len?=?read(frd,buf,BUF_SIZE))?)?{
if?(-1?==?read_len)?{
my_err("Read?error",?__LINE__);
}
else?if?(read_len??0)?{?//把讀取部分寫入目標文件
p_buf?=?buf;
while?(?(write_len?=?write(fwd,p_buf,read_len))?)?{
if(write_len?==?read_len)?{
break;
}
else?if?(write_len??0)?{?//只寫入部分
p_buf?+=?write_len;
read_len?-=?write_len;
}
else?if(-1?==?write_len)?{
my_err("Write?error",?__LINE__);
}
}
if?(-1?==?write_len)?break;
}
}
}
int?main(int?argc,?char?**argv)?
{
int?frd,?fwd;?//讀寫文件描述符
int?len?=?0;
char?*pSrc,?*pDes;?//分別指向源文件路徑和目標文件路徑
struct?stat?src_st,des_st;
if?(argc??3)?{
printf("用法?./MyCp?源文件路徑?目標文件路徑\n");
my_err("arguments?error?",?__LINE__);
}
frd?=?open(argv[1],O_RDONLY);
if?(frd?==?-1)?{
my_err("Can?not?opne?file",?__LINE__);
}
if?(fstat(frd,src_st)?==?-1)?{
my_err("stat?error",__LINE__);
}
/*檢查源文件路徑是否是目錄*/
if?(S_ISDIR(src_st.st_mode))?{
my_err("略過目錄",__LINE__);
}
pDes?=?argv[2];
stat(argv[2],des_st);
if?(S_ISDIR(des_st.st_mode))?{?//目標路徑是目錄,則使用源文件的文件名
len?=?strlen(argv[1]);
pSrc?=?argv[1]?+?(len-1);?//指向最后一個字符
/*先找出源文件的文件名*/
while?(pSrc?=?argv[1]??*pSrc?!=?'/')?{
pSrc--;
}
pSrc++;//指向源文件名
len?=?strlen(argv[2]);?
//?.?表示復制到當前工作目錄
if?(1?==?len??'.'?==?*(argv[2]))?{
len?=?0;?//沒有申請空間,后面就不用釋放
pDes?=?pSrc;
}
else?{?//復制到某目錄下,使用源文件名
pDes?=?(char?*)malloc(sizeof(char)*PATH_LEN);
if?(NULL?==?pDes)?{
my_err("malloc?error?",?__LINE__);
}
strcpy(pDes,argv[2]);
if?(?*(pDes+(len-1))?!=?'/'?)?{?//目錄缺少最后的'/',則補上’/‘
strcat(pDes,"/");
}
strcat(pDes+len,pSrc);
}
}
/*?打開目標文件,?使權限與源文件相同*/?
fwd?=?open(pDes,O_WRONLY?|?O_CREAT?|?O_TRUNC,src_st.st_mode);
if?(fwd?==?-1)?{
my_err("Can?not?creat?file",?__LINE__);
}
copy_data(frd,fwd);
//puts("end?of?copy");
if?(len??0??pDes?!=?NULL)
free(pDes);
close(frd);
close(fwd);
return?0;
}
呵呵,這是bash的功能吧,你輸入
ls"
或
ls`
都有和
ls'類似的效果。
"
'
`都可以看作是引號,在命令中通常要成對出現(xiàn),你只打了一個',所以系統(tǒng)要等你輸下一個以配對處理。
這個特性有助于編寫腳本。在本例中沒有什么應用。
本序列涉及的 Linux 源碼都是基于 linux-4.14.143 。
1.1 文件抽象
在 Linux 內(nèi)核里,文件是一個抽象,設備是個文件,網(wǎng)絡套接字也是個文件。
文件抽象必須支持的能力定義在 file_operations 結構體里。
在 Linux 里,一個打開的文件對應一個文件描述符 file descriptor/FD,F(xiàn)D 其實是一個整數(shù),內(nèi)核把進程打開的文件維護在一個數(shù)組里,F(xiàn)D 對應的是數(shù)組的下標。
文件抽象的能力定義:
1.2 文件 poll 操作
poll 函數(shù)的原型:
文件抽象 poll 函數(shù)的具體實現(xiàn)必須完成兩件事(這兩點算是規(guī)范了):
1. 在 poll 函數(shù)敢興趣的等待隊列上調(diào)用 poll_wait 函數(shù),以接收到喚醒;具體的實現(xiàn)必須把 poll_table 類型的參數(shù)作為透明對象來使用,不需要知道它的具體結構。
2. 返回比特掩碼,表示當前可立即執(zhí)行而不會阻塞的操作。
下面是某個驅動的 poll 實現(xiàn)示例,來自::
poll 函數(shù)接收的 poll_table 只有一個隊列處理函數(shù) _qproc 和感興趣的事件屬性 _key。
文件抽象的具體實現(xiàn)在構建時會初始化一個或多個 wait_queue_head_t 類型的事件等待隊列 。
poll 等待的過程:
事件發(fā)生時的喚醒過程:
一個小困惑:
文章題目:linux命令的實現(xiàn)原理,linux系統(tǒng)操作原理
當前網(wǎng)址:http://chinadenli.net/article29/dsigcjh.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供、建站公司、網(wǎng)站建設、網(wǎng)站策劃、標簽優(yōu)化、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)