欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

linux命令的實現(xiàn)原理,linux系統(tǒng)操作原理

linux中cp命令如何用 C語言實現(xiàn)

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;

}

linux下面的 ls命令的 實現(xiàn)原理是什么啊?那些返回結果是怎么跳出來的

呵呵,這是bash的功能吧,你輸入

ls"

ls`

都有和

ls'類似的效果。

"

'

`都可以看作是引號,在命令中通常要成對出現(xiàn),你只打了一個',所以系統(tǒng)要等你輸下一個以配對處理。

這個特性有助于編寫腳本。在本例中沒有什么應用。

Linux select/poll/epoll 原理(一)實現(xiàn)基礎

本序列涉及的 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)

網(wǎng)站托管運營