這篇文章給大家分享的是有關(guān)Linux進(jìn)程函數(shù)fork(),vfork(),execX()有什么用的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
成都創(chuàng)新互聯(lián)始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營(yíng)理念,通過多達(dá)10多年累計(jì)超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的營(yíng)銷解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:加固等企業(yè),備受客戶贊譽(yù)。
fork函數(shù):創(chuàng)建一個(gè)新進(jìn)程
1、fork()成功后,將為子進(jìn)程申請(qǐng)PCB和用戶內(nèi)存空間。
2、子進(jìn)程會(huì)復(fù)制父進(jìn)程用戶空間的所有數(shù)據(jù)(代碼段、數(shù)據(jù)段、BSS、堆、棧),文件描述符。
3、復(fù)制父親進(jìn)程PCB中絕大多數(shù)信息。
4、雖然子進(jìn)程復(fù)制了文件描述符,而對(duì)于文件描述符相關(guān)的文件表項(xiàng)(struct file結(jié)構(gòu)),則采用共享的方式。
一個(gè)實(shí)例:
#include <unistd.h> //fork fuction #include <fcntl.h> //file operator #include <sys/types.h> #include <stdio.h> #include <stdlib.h> //exit fuction #include <string.h> int main() { pid_t pid; int i=1; int status; char *ch2="hello",*ch3="world",*ch4="IN"; int fd; if ((fd=open("fork.txt",O_RDWR|O_CREAT,0644))==-1) { perror("not open"); exit(EXIT_FAILURE); } if (write(fd,ch2,strlen(ch2))==-1) { //write in fork.txt perror("not write"); exit(EXIT_FAILURE); } if ((pid=fork())==-1) { perror("fork error"); exit(EXIT_FAILURE); } else if(pid==0) { //son process int i=2; //change i printf("child:i=%d\n",i); if (write(fd,ch3,strlen(ch3))==-1) perror("child write"); return 0; } else { sleep(1); printf("parent:i=%d\n",i); if (write(fd,ch4,strlen(ch4))==-1) perror("child write"); wait(&status); return 0; } }
運(yùn)行:
[root@localhost linux]# gcc -o fork fork.c [root@localhost linux]# ./fork child:i=2 parent:i=1
可以看到在子進(jìn)程中改變了i的值,然而父進(jìn)程i仍為1,所以說子進(jìn)程和父進(jìn)程有自己的用戶空間。而打開所創(chuàng)建的fork.txt可以得到hellowordIN,父子進(jìn)程共同對(duì)一個(gè)文件操作寫入的數(shù)據(jù)是不交叉覆蓋的,說明父子進(jìn)程共享文件偏移,一次共享文件表項(xiàng)。
與fork()函數(shù)不同,vfork()函數(shù)在創(chuàng)建進(jìn)程是并不復(fù)制父進(jìn)程的地址空間,而是在必要的時(shí)候才申請(qǐng)新的存儲(chǔ)空間,因此使得vfork()更有效率。
特別注意的是vfork()是共享父進(jìn)程的代碼以數(shù)據(jù)段。
一個(gè)例子:
#include <unistd.h> //fork fuction #include <fcntl.h> //file operator #include <sys/types.h> #include <stdio.h> #include <stdlib.h> //exit fuction #include <string.h> int i=10; int main() { pid_t pid; if ((pid=fork())==-1) { perror("fork error"); exit(EXIT_FAILURE); } else if(pid==0) { //son process i++; printf("child:i=%d\n",i); _exit(0); } else { sleep(1); printf("parent:i=%d\n",i); return 0; } }
注意:上面的代碼中回收子進(jìn)程用的是_exit(0),如果用return 0;的話它會(huì)回收用戶空間,因此在父進(jìn)程調(diào)用的時(shí)候會(huì)出現(xiàn)段錯(cuò)誤。
下面是調(diào)用輸出結(jié)果:
如果以fork()創(chuàng)建則會(huì)輸出: [root@localhost linux]# ./fork child:i=11 parent:i=10 如果改為vfork(),則: child:i=11 parent:i=11
用fork()函數(shù)創(chuàng)建紫禁城后,如果希望在當(dāng)前子進(jìn)程中運(yùn)行新的程序,則可以調(diào)用execX系列函數(shù)。
注意:當(dāng)進(jìn)程調(diào)用exec函數(shù)后,該進(jìn)程的用戶空間資源完全有新程序代替。
這些函數(shù)的區(qū)別在于:
1、指示新程序的位置是路徑還是文件名
2、在使用參數(shù)時(shí)是使用參數(shù)列表哈市使用argv[]數(shù)組
3、后綴有l(wèi)(list)表示使用參數(shù)列表,v表示使用argv[]數(shù)組
具體如下所示:
#include<unistd.h> int execl(const char *pathname,const char *arg0,.../*(char *) 0 */); int execv(const char *pathname,char *const argv[]); int execle(const char *pathname,const char *arg0,.../*(char *) 0 ,char *const envp[] */); int execve(const char *pathname,char *const argv[],char *const envp[]); int execlp(const char *filename,const char*arg0,.../*(char *) 0*/); int execvp(const char *filename, char *const argv[]); int fexecve(int fd,char *const argv[],char *const evnp[]);
一個(gè)實(shí)例:
#include <unistd.h> #include <stdio.h> #include <sys/types.h> int main(int argc ,char* argv[]) { pid_t pid; if ((pid=fork())==-1) printf("error"); else if (pid==0) execl("/bin/ls","ls","-l",argv[1],(char *)0); else printf("father ok\n"); }
運(yùn)行可以看到在子進(jìn)程中執(zhí)行了ls命令。
[yqtao@localhost linux]$ gcc -o exec execX.c [yqtao@localhost linux]$ ./exec /home father ok
//execlp()函數(shù)使用
#include <unistd.h> #include <stdio.h> #include <sys/types.h> int main(int argc ,char* argv[]) { execlp("ls","ls","-l","/home",(char*)0); }
//execv()函數(shù)的使用
#include <unistd.h> #include <stdio.h> #include <sys/types.h> int main(int argc ,char* argv[]) { char* argv1[]={"ls","-l","/home",0}; execv("/bin/ls",argv1); }
ecvp()會(huì)從環(huán)境變量PATH所指定的目錄中查找文件名作為第一個(gè)參數(shù),第二個(gè)及以后的參數(shù)由參數(shù)列表,注意最后一個(gè)成員必須為NULL
#include <unistd.h> #include <stdio.h> #include <sys/types.h> int main(int argc ,char* argv[]) { char* argv1[]={"ls","-l","/home",0}; execvp("ls",argv1); }
感謝各位的閱讀!關(guān)于“Linux進(jìn)程函數(shù)fork(),vfork(),execX()有什么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
分享題目:Linux進(jìn)程函數(shù)fork(),vfork(),execX()有什么用
網(wǎng)頁(yè)地址:http://muchs.cn/article38/gdopsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、企業(yè)建站、微信小程序、網(wǎng)站維護(hù)、域名注冊(cè)、全網(wǎng)營(yíng)銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)