1. 程式人生 > 其它 >Linux---cp命令學習

Linux---cp命令學習

技術標籤:linux命令實現核心linuxjavapython大資料

cp命令

cp source_file target_file

能夠複製檔案,如果target_file所指定的檔案不存在,cp就建立這個檔案,如果已經存在,就把檔案內容清空並把source_file的內容新增到target_file中。

cp命令的工作流程

      open sourcefile for reading

     open targetfile for writing

   +--> read from source to buffer ---- eof ? --- +

   |                   |

   ----- write from buffer to copy <------------- +

      close sourcefile

      close targetfile

 1 #include <stdio.h>
 2 #include <fcntl.h>
 3 #include <unistd.h>
 4 #include <stdlib.h>
 5 
 6 #define BUFFERSIZE    4096
 7 #define COPYMODE    0644
 8 
 9 void oops(char *s1, char *s2);
10 int main(int ac,char *av[])
11 {
12     int in_fd,out_fd,n_chars;
13     char buf[BUFFERSIZE];
14 
15     if(ac != 3)
16     {
17         fprintf(stderr,"usage:%s source destination\n",*av);
18         exit(1);
19     }    
20 
21     if( (in_fd = open(av[1],O_RDONLY)) == -1)
22     {
23         oops("Cannot open" , av[1]);
24     }
25 
26     if( (out_fd = creat(av[2],COPYMODE)) == -1 )
27     {
28         oops("Cannot open" , av[2]);
29     }
30 
31     while( ( n_chars = read(in_fd,buf,BUFFERSIZE)) > 0 )
32         if( (write(out_fd,buf,n_chars)) != n_chars)
33              oops("Write error to ", av[2]);
34     
35     if(n_chars == -1)
36     oops("Read error from ",av[1]);
37 
38     if(close(in_fd) == -1 || close(out_fd) == -1)
39     oops("Error closing files","");
40 
41 }
42 
43 void oops(char *s1, char *s2)
44 {
45     fprintf(stderr,"Error:%s",s1);
46     perror(s2);
47     exit(1);
48 
49 }

效果如下

使用到的函式:

1.int fd = creat(char * filename, mode_t mode)

creat告訴核心建立一個filename的檔案,如果不存在,則直接建立,如果存在,則先把檔案的內容清空,把檔案長度設定為0。並且把檔案的許可權設定為mode

2.ssize_t result = write(int fd,void * buf,size_t amt)

write這個系統呼叫告訴核心把資料寫入檔案中,如果寫入失敗返回 -1 ,成功返回寫入的位元組數。

cp命令的分析

1. 緩衝區的影響

 緩衝區的大小對我們這個程式的執行速度是有影響的,舉一個例子:用小勺子把湯從一個碗裡盛到另一個碗裡,可能要盛十幾次,當換成一個大一點的勺子,可能只需要幾次。

2. 系統呼叫的開銷

使用系統呼叫會消耗很多時間,使用者程序位於使用者空間,核心程序位於核心空間,磁碟只能被核心直接訪問。當我們要讀取檔案時,需要使用系統呼叫read,而read在核心空間中,因此,執行的時候是從使用者空間切換到核心空間,這是需要時間的。為什麼需要時間?當CPU從使用者模式切換到管理員模式時,需要進行一些環境的配置,如一些特殊的堆疊和記憶體環境。當使用完系統呼叫時,CPU就又要從管理員模式切換到使用者模式,也需要花費一些時間,因此,在一些程式中應該節約類似於模式切換的開銷。

本篇筆記自拜讀《 Unix/Linux程式設計實踐教程》

我也推薦和我一樣的初學者去拜讀這本書,讓你對linux有可下手的地方。