进程调度

概述:创建子进程的函数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
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
#inlude
#incclude
#include
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);

}