進程調度
概述:創建子進程的函數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);
}