亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入解讀Linux進程函數fork(),vfork(),execX()

 更新時間:2018年01月23日 14:33:09   作者:yqtaowhu  
這篇文章主要介紹了深入解讀Linux進程函數fork(),vfork(),execX(),分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下

本文研究的主要是Linux進程函數fork(),vfork(),execX()的相關內容,具體介紹如下。

函數fork()

fork函數:創(chuàng)建一個新進程

1、fork()成功后,將為子進程申請PCB和用戶內存空間。
2、子進程會復制父進程用戶空間的所有數據(代碼段、數據段、BSS、堆、棧),文件描述符。
3、復制父親進程PCB中絕大多數信息。
4、雖然子進程復制了文件描述符,而對于文件描述符相關的文件表項(struct file結構),則采用共享的方式。

一個實例:

#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 *ch1="hello",*ch2="world",*ch3="IN";
 int fd;
 if ((fd=open("fork.txt",O_RDWR|O_CREAT,0644))==-1) {
 perror("not open");
 exit(EXIT_FAILURE);
 }
 if (write(fd,ch1,strlen(ch1))==-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,ch2,strlen(ch2))==-1)
 perror("child write");
 return 0;
 }
 else {
 sleep(1);
 printf("parent:i=%d\n",i);
 if (write(fd,ch3,strlen(ch3))==-1)
 perror("child write");
 wait(&status);
 return 0;
 }
}

運行:

[root@localhost linux]# gcc -o fork fork.c 
[root@localhost linux]# ./fork 
child:i=2 
parent:i=1

可以看到在子進程中改變了i的值,然而父進程i仍為1,所以說子進程和父進程有自己的用戶空間。而打開所創(chuàng)建的fork.txt可以得到hellowordIN,父子進程共同對一個文件操作寫入的數據是不交叉覆蓋的,說明父子進程共享文件偏移,一次共享文件表項。

函數vfork()

與fork()函數不同,vfork()函數在創(chuàng)建進程是并不復制父進程的地址空間,而是在必要的時候才申請新的存儲空間,因此使得vfork()更有效率。

特別注意的是vfork()是共享父進程的代碼以數據段。

一個例子:

#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;
 }
}

注意:上面的代碼中回收子進程用的是_exit(0),如果用return 0;的話它會回收用戶空間,因此在父進程調用的時候會出現段錯誤。

下面是調用輸出結果:

如果以fork()創(chuàng)建則會輸出: 
[root@localhost linux]# ./fork 
child:i=11 
parent:i=10 
如果改為vfork(),則: 
child:i=11 
parent:i=11

函數exec X()系列函數

用fork()函數創(chuàng)建紫禁城后,如果希望在當前子進程中運行新的程序,則可以調用execX系列函數。
注意:當進程調用exec函數后,該進程的用戶空間資源完全有新程序代替。
這些函數的區(qū)別在于:

1、指示新程序的位置是路徑還是文件名
2、在使用參數時是使用參數列表哈市使用argv[]數組
3、后綴有l(wèi)(list)表示使用參數列表,v表示使用argv[]數組

具體如下所示:

#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[]);

一個實例:

#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");
}

運行可以看到在子進程中執(zhí)行了ls命令。

[yqtao@localhost linux]$ gcc -o exec execX.c
[yqtao@localhost linux]$ ./exec /home father ok

//execlp()函數使用

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
int main(int argc ,char* argv[]) {
 execlp("ls","ls","-l","/home",(char*)0);
}

//execv()函數的使用

#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án)境變量PATH所指定的目錄中查找文件名作為第一個參數,第二個及以后的參數由參數列表,注意最后一個成員必須為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);
}

總結

以上就是本文關于深入解讀Linux進程函數fork(),vfork(),execX()的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關文章

  • 詳解如何設置CentOS 7開機自動獲取IP地址

    詳解如何設置CentOS 7開機自動獲取IP地址

    本例中以CentOS 7舉例說明如何設置Linux開機自動獲取IP地址和設置固定IP地址。具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • Linux下如何對端口流量進行統(tǒng)計

    Linux下如何對端口流量進行統(tǒng)計

    本篇文章主要介紹了Linux下如何對端口流量進行統(tǒng)計,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Linux tr命令的使用方法

    Linux tr命令的使用方法

    這篇文章主要介紹了Linux tr命令的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • Linux查看文件夾大小以及刪除大量文件方法

    Linux查看文件夾大小以及刪除大量文件方法

    有時候Linux主機磁盤占用過多,需要進行手動清理,一方面是查看文件夾占用大小,另一方面是進行文件的高效刪除,所以本文介紹了Linux查看文件夾大小以及刪除大量文件方法,需要的朋友可以參考下
    2024-09-09
  • linux cd的含義以及用法

    linux cd的含義以及用法

    在本文里我們給大家整理了關于linux cd的含義以及用法并把相關知識點做了詳細介紹,需要的朋友們參考下。
    2019-05-05
  • linux抵御DDOS攻擊 通過iptables限制TCP連接和頻率

    linux抵御DDOS攻擊 通過iptables限制TCP連接和頻率

    這篇文章主要介紹了linux抵御DDOS攻擊 通過iptables限制TCP連接和頻率,需要的朋友可以參考下
    2016-05-05
  • Linux搭建DHCP服務器的詳細過程

    Linux搭建DHCP服務器的詳細過程

    DHCP動態(tài)主機配置協(xié)議是一個局域網的網絡協(xié)議,指的是由服務器控制一段IP地址范圍,客戶機登錄服務器時就可以自動獲得服務器分配的IP地址和子網掩碼,這篇文章主要介紹了Linux搭建DHCP服務器,需要的朋友可以參考下
    2022-10-10
  • windows apache多端口虛擬主機配置方法

    windows apache多端口虛擬主機配置方法

    有很多朋友喜歡在windows下使用apache作為web服務器,有時候想用非80端口提供服務,因為未備案域名都是封了80端口,提供下載的時候可以用別的端口了,這里簡單分享下,方便需要的朋友
    2013-03-03
  • 詳解Linux進程調度策略

    詳解Linux進程調度策略

    這篇文章主要介紹了詳解Linux進程調度策略,以及代碼實現中重要環(huán)節(jié)的指點,一起來學習下。
    2017-11-11
  • Centos 6.8編譯安裝LNMP環(huán)境(Nginx+MySQL+PHP)教程

    Centos 6.8編譯安裝LNMP環(huán)境(Nginx+MySQL+PHP)教程

    這篇文章主要介紹了關于CentOS 6.8中編譯安裝LNMP環(huán)境的相關資料,LNMP即Linux,Nginx,MySQL,PHP,文中通過一步步的步驟介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03

最新評論