進程創建、exec函數簇,等待進程,替換進程實現

進程調度

概述:創建子進程的函數fork()函

數,
父進程在創建子進程的時候子進程會複製父函數的數據段,
代碼段是共享,但是數據段是複製!

fork函數與vfork函數的區別:


1、fork:子進程拷貝父進程;
2、vfork:子進程與父進程共享數據段;
3、fork的運行次序不一定;
4、vfork:一定是子進程先運行,父進程後運行;


exec函數族
exec用被執行的函數替換調用他的程序
區別:
fork創建的一個新進程,產生新的pid;
exec啓動一個新程序,替換原有的進程,因此進程的Pid不會改變。

int execl(const char*path,const char *arg1,...)
參數:
main()
{
execl("/bin/ls","ls","-al","/etc/passwd",(char*)0);
path:excute fun name
arg[1]函數命令
                  //ls -al /etc/passwd 
}

 

/*****************exec函數族的介紹***************/

#include<unistd.h>
int execlp(const char *path ,const char *arg1,...)

main()
{
execlp("ls","ls","-al","/etc/passwd",(char*)0);
path:excute fun name
arg[1]函數命令
                  //ls -al /etc/passwd 
}

 

 

 

/*****************exec函數族的介紹***************/

 

int execv (const *path ,char *const argv[])
參數:被執行程序包含完整的路徑
argv[]:被執行的程序所需的命令行參數組;

main(){
char *argv[]={"ls","-al","etc/passwd",(char*)0};

excv("/bin/ls",argv);

 

}

 

 

int system(const char *string)

功能:調用fork產生子進程,由子進程調用/bin/sh -c string
來執行string所代表的命令。

對於進程來說,有的進程知識運行一次就結束了,一般會把此進程刪除與內存中,但是服務函數就一直在等待狀態,除非取消該服務。

 

 

進程等待

wait(int *status)
功能:阻塞某個進程,直到子進程退出了;

例子:
#include<sys/tyoes.h>
#inlude<sys/wait.h>
#incclude<unistd.h>
#include<stdlib.h>
void main()
{
pid_t pc,pr;

pc=fork();
if(pc==0)
 {printf("this is a sun process with pid of %d\n"),pr; 

 sleep(10);//sec waiting
 }


else if(pc>0){


 pr=wait(NULL);
 printf("i catched a child process with pid of \n%d\n");,pr
 
}

 exit(0);

}

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章