『壹』 linux + 怎樣控制c靜態庫的導出函數
Linux庫有動態與靜態兩種,動態通常用.so為後綴,靜態用.a為後綴。例如:libhello.so libhello.a 為了在同一系統中使用不同版本的庫,可以在庫文件名後加上版本號為後綴,例如: libhello.so.1.0,由於程序連接默認以.so為文件後綴名。所以為了使用這些庫,通常使用建立符號連接的方式。 ln -s libhello.so.1.0 libhello.so.1 ln -s libhello.so.1 libhello.so 動態庫和靜態庫的區別: 當要使用靜態的程序庫時,連接器會找出程序所需的函數,然後將它們拷貝到執行文件,由於這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記『指明當程序執行時,首先必須載入這個庫。由於動態庫節省空間,linux下進行連接的預設操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。 兩種庫的編譯產生方法: 第一步要把源代碼編繹成目標代碼。以下面的代碼hello.c為例,生成hello庫: /* hello.c */ #include void sayhello() { printf("hello,world\n"); } 用gcc編繹該文件,在編繹時可以使用任何全法的編繹參數,例如-g加入調試代碼等
『貳』 linux下寫一個簡單的函數實現cp命令,能夠復制普通文件,在線等,必採納
#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
int main(int argc,char **argv)
{
if(argc<3)//參數少於3,給出提示並退出
{
printf("請按如下格式運行!\n");
printf("./程序 源文件 目標文件\n");
return 0;
}
int fd1 = open(argv[1],O_RDONLY);//只讀方式打開源文件
if(-1 == fd1)
{
perror("打開文件失敗");
return 0;
}
int fd2 = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0666);//讀寫方式打開文件,有則清空,沒有則創建
char buf[100]={0};
int res;
while(res = read(fd1,buf,sizeof(buf)))//從源文件讀出
{
write(fd2,buf,res);//寫入到目標文件
}
close(fd1);//關閉文件
close(fd2);
return 0;
}
『叄』 Linux有沒有文件夾的復制,移動,重命名函數
跟文件一樣。
cp命令用於復制文件或目錄,格式為:「cp [選項] 源文件 目標文件」。
想必您一定對復制操作不是很陌生的,在Linux系統中的復制操作其實具體還分為3種情況,第一種情況是如果目標文件是個目錄,則會將源文件復制到該目錄中,第二種情況是如果目標文件也是個普通文件,則會提示是否要覆蓋它,最後是第三種的情況了,如果目標文件是不存在的,則會將源文件修改成目標文件的名稱,類似於是重命名的操作。
參數
作用
-p
保留原始文件的屬性
-d
若對象為"鏈接文件",則保留該"鏈接文件"的屬性
-r
遞歸持續復制(用於目錄)
-i
若目標文件存在則詢問是否覆蓋
-a
相當於-pdr(p,d,r為上述的參數)
首先創建一個名為install.log的文件,然後將其復制出來一份名為x.log的備份文件:
[root@linuxprobe ~]# touch install.log
[root@linuxprobe ~]# cp install.log x.log
[root@linuxprobe ~]# ls
install.log x.log
mv命令用於移動文件或改名,格式為:「mv [選項] 源文件 [目標路徑|目標文件名]」。
剪切操作不同於復制操作,因為它會默認將源文件刪除掉,用戶就只有剪切後的文件了,並且如果對一個文件在同一個目錄中進行剪切操作,其實也是重命名的作用:
[root@linuxprobe ~]# mv x.log linux.log
rm命令用於刪除文件或目錄,格式為:「rm [選項] 文件」。
在Linux系統中刪除文件時會默認再向您詢問是否要執行刪除操作,如果不想總看到這種反復的確認信息,您可以使用「-f」參數來直接強制刪除,另外還要刪除於目錄文件夾的話,必需追加一個「-r」參數才可以,否則是刪除不掉的,例如咱們來嘗試刪除下剛剛那兩個文件吧:
[root@linuxprobe ~]# ls
install.log linux.log
[root@linuxprobe ~]# rm install.log
rm: remove regular empty file 『install.log』? y
[root@linuxprobe ~]# rm -rf linux.log
[root@linuxprobe ~]# ls
[root@linuxprobe ~]#
可以看下http://www.linuxprobe.com/chapter-02.html
『肆』 linux提供的拷貝函數
這句話表達得有問題,應該是 Linux 系統提供的文件拷貝命令是 cp。基本格式是:cp file1 file2
若想表達拷貝函數的話,那麼只能夠用於程序設計語言中,例如:字元串拷貝函數。
『伍』 求linux下復制文件到其他目錄的c語言庫函數
如果必須用函數實現的話,基本思路如下:
1. fopen已知文件,把內容讀到buffer(char [])中去(fread), fclose當前文件
2. fopen新文件(用新名字)在目錄1中,把buffer內容寫入新文件(fwrite),fclose之
3. 重復第2步,只是換成目錄2
注意,也可用open/read/write,但fopen/fread/fwrite是更常用更符合C標准庫更容易移植的版本。
『陸』 linux c語言字元串連接函數
可以使用strcat()函數,函數原型char *strcat(char *dest,const char *src);函數說明:strcat()會將參數src字元串拷貝到參數dest所指的字元串尾。第一個參數dest要有足夠的空間來容納要拷貝的字元串。返回值:返回參數dest的字元串起始地址。
例子:
#include<string.h>
main()
{
char a[30]="string1";
char b[]="string2";
printf("before strcat():%s\n",a);
printf("after strcat():%s\n",strcat(a,b));
}
執行結果:
before strcat():string1
after strcat():string1string2
『柒』 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 內核 get_user()函數什麼意思
linux 內核 get_user()函數用於核空間和用戶空間交換數據。
Linux是一種開源電腦操作系統內核。它是一個用C語言寫成,符合POSIX標準的類Unix操作系統。
Linux最早是由芬蘭黑客 Linus Torvalds為嘗試在英特爾x86架構上提供自由免費的類Unix操作系統而開發的。該計劃開始於1991年,在計劃的早期有一些Minix 黑客提供了協助,而今天全球無數程序員正在為該計劃無償提供幫助。
Linux是一個一體化內核(monolithic kernel)系統。「內核」指的是一個提供硬體抽象層、磁碟及文件系統控制、多任務等功能的系統軟體。一個內核不是一套完整的操作系統。一套基於Linux內核的完整操作系統叫作Linux操作系統,或是GNU/Linux。設備驅動程序可以完全訪問硬體。Linux內的設備驅動程序可以方便地以模塊化(molarize)的形式設置,並在系統運行期間可直接裝載或卸載。