Burp Suite中文汉化终极指南:5步实现专业级安全测试界面
2026/7/19 12:28:13
hello~ 很高兴见到大家! 这次带来的是Linux系统中关于进程控制这部分的一些知识点,如果对你有所帮助的话,可否留下你宝贵的三连呢?
个 人 主 页: 默|笙
接上次博客---->[进程控制(1)进程创建、终止]。
#include<sys/wait.h>2#include<stdio.h>3#include<unistd.h>4#include<stdlib.h>56intmain()7{8pid_t id=fork();9if(id==0)10{11intcnt=5;12while(cnt--)13{14printf("我是一个子进程!pid:%d, ppid:%d\n",getpid(),getppid());15}16exit(0);//子进程执行完退出17}18sleep(10);19pid_t sid=wait(NULL);20if(sid>0)21{22printf("我是一个父进程!pid:%d,我等待成功了,回收的是pid为%d> 的子进程\n",getpid(),sid);23}24return0;25}同样需要包含头文件sys/wait.h进行使用,不过与wait不同的是,它多了两个参数,一个pid,一个options。
第一个参数pid是要传给它目标子进程pid,然后它就只会等这个目标子进程,如果想回收任意子进程,就传-1。
stat_loc也是输出型参数,用来获取子进程的退出信息。
options默认值为0,表示阻塞等待,即父进程等待子进程的这段时间什么事情都不干,就干等。如果传入WNOHANG(wait no hang不等待),表示非阻塞等待,也就是在等待子进程的时间里面父进程可以干其他的事情。
返回值:在阻塞状态下等待成功则返回所等待子进程的pid,等待失败则返回-1;在非阻塞状态下,如果子进程还没有执行完成则返回0,不继续等待,若正常结束,返回子进程pid。
阻塞等待vs非阻塞等待
- 打个比方,我烧一壶水,烧这一壶水是需要时间的,阻塞等待就是我一直在这里等着这壶水烧开,这段时间里我什么也不干,就在它旁边守着直到听到它发出咕噜咕噜的声音知道它烧开为止;非阻塞等待就是我在烧这壶水的期间去干其他事情,干一会儿就回来看看水烧开没有,这样既可以等待水的烧开又可以干自己的事情。
- 要注意的是,等待的时间是取决于子进程的,无论是阻塞等待还是非阻塞等待要等的时间都是一样的。不存在非阻塞等待比阻塞等待效率高的说法,只能说是非阻塞等待干其他事情的效率提高了。
//非阻塞状态实验代码1#include<stdio.h>2#include<unistd.h>3#include<stdlib.h>4#include<sys/wait.h>56intmain()7{8pid_t id=fork();9if(id==0)10{11intcnt=5;12while(cnt--)13{14sleep(1);15printf("我是一个子进程,pid:%d, ppid: %d\n",getpid(),getppid());16}17exit(0);18}19while(1)20{21pid_t sid=waitpid(id,NULL,WNOHANG);22if(sid==0)23{24printf("我是父进程,子进程还没执行完,我要干我自己的事情了\n");25//写父进程等待期间要执行的代码26}27elseif(sid>0)28{29printf("我是父进程,我回收成功了!pid:%d\n",getpid());30exit(0);31}32}33return0;34}
- WIFEXITED(status): 若为正常终止进程返回的状态,则为真(1)。对应(status & 0x7F) == 0,如果信号为0,说明正常终止了。0x7F = 0111 1111。
- WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程
的退出码)对应(status >> 8) & 0xFF,向左移动8位进行提取。0xFF = 1111 1111。
1#include<stdio.h>2#include<unistd.h>3#include<stdlib.h>4#include<sys/wait.h>56intmain()7{8pid_t id=fork();9if(id==0)10{11intcnt=5;12while(cnt--)13{14sleep(1);15printf("我是一个子进程,pid:%d, ppid: %d\n",getpid(),getppid());16}17exit(0);18}19while(1)20{21int*status=NULL;22pid_t sid=waitpid(id,status,WNOHANG);23if(sid==0)24{25// printf("我是父进程,子进程还没执行完,我要干我自己的事情了\n");26//写父进程等待期间要执行的代码27}28elseif(sid>0)29{30printf("我是父进程,我回收成功了!pid:%d\n",getpid());31printf("我是父进程,WIFEXITED:%d, WEXITSTATUS:%d\n",WIFEXITED(status),WEXITSTATUS(status));32exit(0);33}34}35return0;36}今天的分享就到此结束啦,如果对读者朋友们有所帮助的话,可否留下宝贵的三连呢~~
让我们共同努力, 一起走下去!