如何自己写一个网站,张家港质监站网址,php模拟登陆wordpress,万网空间官方网站文章目录 进程控制#xff08;二#xff09;进程等待wait函数waitpid函数wait/waitpid获取子进程状态码的过程进程等待相关的宏 总结 进程控制#xff08;二#xff09;
延续对于上文进程结束#xff0c;我们继续对于进程控制进行学习#xff0c;本文我们主要是对于进程… 文章目录 进程控制二进程等待wait函数waitpid函数wait/waitpid获取子进程状态码的过程进程等待相关的宏 总结 进程控制二
延续对于上文进程结束我们继续对于进程控制进行学习本文我们主要是对于进程等待进行学习进程等待我们在前文初步接触进程的时候我们知道进程等待是指我们在运行该进程的时候在等待资源当有了资源分配后便可以运行该进程在本文中我们认识的进程等待是指子进程退出时先进入僵尸状态然后父进程进行等待wait/waitpid来获取子进程退出信息这个过程叫做进程等待。
进程等待
进程等待是子进程退出信息被父进程接收时父进程处于等待状态的一种描述。
进程等待是指通过系统调用wait/waitpid来进行对子进程进行状态检测与回收的功能。 子进程退出时如果父进程没有接收信息那么会导致僵尸进程的问题造成内存泄漏所以父进程必须通过进程等待来回收子进程退出信息。必要通过回收子进程的退出信息也可以知道子进程退出码以及是否出现异常status。可选 所以我们必须要实现进程等待防止内存泄漏对于得到的子进程退出信息我们可以选择性的利用可有可无看自己需求。
wait函数
wait函数可以实现进程等待只有一个参数status输出型参数可以获得子进程退出信息 wait函数在2号手册上头文件也可以表明wait函数以及waitpid函数是系统调用接口通过该函数来访问操作系统使得操作系统对于子进程进行回收处理。 core dump以后会用到现在不需要掌握只需要知道这是用来进行调试的。
#includestdio.h
#includesys/types.h
#includesys/wait.h
#includeunistd.h
#includestdlib.h#define N 10void RunChild()
{int cnt5;while(cnt){printf(Child pid: %d, parent pid: %d\n,getpid(),getppid());//获取pid和ppidsleep(1);cnt--;}//printf(Child pid: %d, parent pid: %d\n,getpid(),getppid());//获取pid和ppid//sleep(15);
}int main()
{//实现创建子进程并对于子进程进行等待for(int i0;iN;i){pid_t idfork();//创建子进程if(id0){RunChild();exit(i);//退出码}//父进程执行下面信息printf(create Child proc : %d success\n,id);}sleep(10);return 0;
}上述代码我们并没有是wait会造成内存泄漏下面我们来通过父进程来接收子进程的退出信息。
#includestdio.h
#includesys/types.h
#includesys/wait.h
#includeunistd.h
#includestdlib.h#define N 10void RunChild()
{int cnt5;while(cnt){printf(Child pid: %d, parent pid: %d\n,getpid(),getppid());//获取pid和ppidsleep(1);cnt--;}//printf(Child pid: %d, parent pid: %d\n,getpid(),getppid());//获取pid和ppid//sleep(15);
}int main()
{//实现创建子进程并对于子进程进行等待for(int i0;iN;i){pid_t idfork();//创建子进程if(id0){RunChild();exit(i);//退出码}//父进程执行下面信息//wait进程等待printf(create Child proc : %d success\n,id);}//进程等待for(int i0;iN;i){//会实现进程的等待pid_t idwait(NULL);//wait等待是随机的等待还没有被接收信息的子进程有几个子进程就需要等几次。//int status0;//pid_t idwait(status);//传地址操作系统来进行存储子进程退出信息if(id0){//printf(wait %d success\n ; exit sig: %d\n,id,WEXITSTATUS(status));printf(wait %d success\n,id);}}return 0;
}waitpid函数
waitpid函数其拥有三个参数功能相较于wait更多可以认为waitpid可以包含wait的功能wait的功能比较单一智能获取状态码status而且是随机等待子进程。
#include sys/types.h
#include sys/wait.hpid_t waitpid(pid_t pid, int* status, int options);参数介绍 返回值pid_t 大于0表示等待子进程成功返回值是子进程的pid小于0表示等待子进程失败等于0表示等待条件还没有就绪此时父进程可以做自己的事情 pid参数 大于0表示等待指定的子进程pid -1 表示等待随机子进程 status参数 NULL表示不需要子进程的状态码反之作为输出型参数操作系统将子进程退出信息写入status中 options参数 0表示阻塞等待WNOHONG表示非阻塞等待 wait/waitpid获取子进程状态码的过程
wait和waitpid都是系统调用为什么要通过系统调用函数而不是库函数来实现该功能这是因为由于进程具有独立性相互不影响所以一般的函数无法访问到另一进程的内容而系统调用可以在全局上操作系统的角度来找到子进程PCB得到状态码
等待流程 子进程运行完毕后进入僵尸状态Z将退出码信息存储到子进程PCB中exit_code,exit_signal,释放代码以及数据保留task_struct结构体信息。父进程通过wait/waitpid通过系统调用得到子进程PCB中的退出信息将推出信息以位图的方式写入到int类型的status参数从而父进程得到子进程的推出信息。 exit_code表示退出码
exit_signal表示结束信号也就是判断是否异常如果为0表示正常如果非零那就是接收了终止信号 kill -num其中numexit_signal
实现方式
exit_signal status0x7F WIFEXITEDstatus
exit_code status80xFF WEXITSTATUSstatus
进程等待相关的宏
WEXITSTATUSstatus表示输出退出码(exit_code)
WNOHONG表示非阻塞等待用于waitpid的option参数。
WIFEXITED(status)通过状态码表示子进程是否正常结束是否异常如果正常返回ture
总结
进程等待是父进程必须要完成的事情是为了防止内存泄漏也是为了知道子进程完成任务情况由状态码得出结论主要是了解wait/waitpid函数以及status参数的构成为什么能表示进程的三种退出情况以及waitpid函数的非阻塞等待宏WNOHONG还有退出码WEXITSTATUS还有判断子进程是否正常退出的宏命令WIFEXITED。