1. Fork会复制父进程所有资源,父子进程完全独立。虽然一个进程可以包含多个线程,但是fork后的子进程是单线程的。
2. vfork不会复制所有的资源,父子进程共享地址空间,在子进程中队虚拟内存空间变量的修改其实也是对父进程中值的修改。同时子进程运行时会阻塞父进程。子进程调用结束时要调用_exit() 退出,不然子进程的输入输出缓存会影响到父进程,exit会刷新输入输出流,清空缓冲区,可能造成临时文件丢失,所以在子进程中一般不用exit。_exit不会进行刷新缓冲区等操作,所以fork,vfork创建的子进程一般都用_exit退出
3. fork后的父子进程代码段,数据段,堆栈段的内容都是相同的,只是用if-eles 判断fork的返回值来走不同的分支
4. exec() 把进程的代码段、数据段、堆栈段的内容都被替换掉。
所以一般 fork一个子进程,然后在子进程中调用exec,子进程就完全被替换掉了
父进程自己跑自己的
execl;ececlp;execle;execv;execve;execvp 出错返回-1,正确无返回值
P:path,第一个参数执行文件名可以不用带路径,函数自动搜索系统的path路径
l:list execl(“pw”,参数a,参数b,null);
v:vector execve(“pw”,argv,environ) char*argv[] 的最后一个指向null
e:environment ;extern char** environ 当前程序的全局环境
Fork.o
#include
int main(int argc ,char* argv[])
{
printf("welecometo PW\n");
int i=0;
for(;i
{
printf("argv[%d]:[%s]\n",i,argv[i]);
}
return 0;
}
#include
#include
#include
#include
void main(int argc,char* argv[])
{
pid_t pid;
int status;
extern char**environ;
int i=0;
for(;i
{
printf("i=%d,argv=[%s]\n",i,argv[i]);
}
//execve("PW",argv,environ);
//printf("运行上一句execve ,这一句不会输出,后面的都不会执行n");
if((pid=vfork())<0)
{
printf("forkerr\n");
exit(1);
}
elseif(pid==0)
{
printf("line16:this child process %d,parent is %d\n",getpid(),getppid());
usleep(1000000);
execve("PW",argv,environ);
_exit(1);
}
else
{
printf("thisparent %d,child is %d\n",getpid(),pid);
printf("parent has waited child %d\n",wait(&status));
}
}
————————————————————————————————————
PW
#include
int main(int argc ,char* argv[])
{
printf("welecometo PW\n");
int i=0;
for(;i
{
printf("argv[%d]:[%s]\n",i,argv[i]);
}
return 0;
}
[root@localhost7-PcroceeControl]# ./fork.o PW
i=0,argv=[./fork.o]
i=1,argv=[PW]
line16:this child process 3507,parent is 3506
thisparent 3506,child is 3507
welecometo PW
argv[0]:[./fork.o]
argv[1]:[PW]
parenthas waited child 3507
5. 进程等待
Sys/types.h
Sys/wait.h
Pid_t wait(int *status);
Pid_t waitpid(pid_t pid,int *status,int options)
Int waited(idtype_t idtype,id_t id, siginfo_t *infop,intoptions);
Wait() = waitpid(-1, &status, 0);子进程不存在
Pid<-1 等待进程组id=pid的绝对值的任一子进程
pid=-1 等待任一子进程
pid=0 等待组id等于调用组id 的任一子进程
pid>0 等待进程id等于pid的子进程
6. 进程组
Sys/types.h
unistd.h
pid_t getpgrp(viod);
int setpgid(pid_t pid,pid_t pgid) 成功0,失败-1 :pid等于pgid时用于创建新的进程组,不等时则把pid加入pgid组
进程调度
Sched.h
Int sched_setscheduler(pid_t pid,int policy,const structsched_param *param);
Int sched_getscheduler(pid_t pid);
Setpriority() ;getpriority()
int phread_cancel(phread_t pt);取消一个线程
int phread_detach(pthread_t pt);分离一个线程
int phread_equal(pthread_t pt1,pthread_t pt2);是不是同一线程,pt1,pt2不是整数只能用这个函数判断