当前位置: 首页 > news >正文

在线黑科技网站中国工商做年报网站

在线黑科技网站,中国工商做年报网站,网站app软件,外贸展示型网站建设公司前言#xff1a; 前面我们对进程已经有了一个初步的了解与认识#xff0c;现在让我们学习一下进程中一些函数的具体使用#xff0c;比如exec可以执行一些指定的程序#xff0c;wait / waitpid可以回收子进程#xff0c;什么是孤儿进程#xff0c;什么是僵尸进程#xf…前言 前面我们对进程已经有了一个初步的了解与认识现在让我们学习一下进程中一些函数的具体使用比如exec可以执行一些指定的程序wait / waitpid可以回收子进程什么是孤儿进程什么是僵尸进程下面让我们一起对这些进行中的操作进行学习吧 目录 一、exec函数族 1.execlp: 2.execl: 3.execvp 4.exec函数族的一般规律 二、回收子进程 1.孤儿进程 2 .僵尸进程 ​编辑 3.wait 4.waitpid 5.waitpid回收多个子进程 一、exec函数族 将当前进程的.text、.data替换为所要加载的程序的.text、.data然后让进程从新的.text第一条指令开始执行但进程ID不变换核丕换壳。   1.execlp: int execlp(const char *file, const char *arg, ...);        借助 PATH 环境变量找寻待执行程序 参1 程序名 参2 argv0 参3 argv1 ... argvN 哨兵NULL 该函数通常用来调用系统程序。如: ls、date、cp、cat等命令。   #includestdio.h #includeunistd.h #includestdlib.hint main(int argc,char *argv[]) {int i;pid_t pid; //创建子进程if(pid -1){perror(fork error);exit(1);}else if(pid 0){ //子进程//execlp(ls,-l,-d,-h,NULL);//错误写法/************************************/execlp(ls,ls,-l,-h,NULL); /************************************/perror(exec error);exit(1);}else if(pid 0){ //父进程sleep(1);printf(Im parent : %d\n,getpid());}return 0; }date命令的实现 execlp(date,date,NULL); 2.execl: int execl(const char *path, const char *arg, ...);    自己指定待执行程序路径。路径程序名 #include stdio.hint main(int argc, char **argv) {printf(Hello, %s!\n, argv[1]);printf(Hello, world!\n);return 0; }#includestdio.h #includeunistd.h #includestdlib.hint main(int argc,char *argv[]) {int i;pid_t pid; //创建子进程if(pid -1){perror(fork error);exit(1);}else if(pid 0){ //子进程//execlp(ls,-l,-d,-h,NULL);//execlp(date,date,NULL);/************************************/execl(./a.out,./a.out,linux,NULL);/************************************/perror(exec error);exit(1);}else if(pid 0){ //父进程sleep(1);printf(Im parent : %d\n,getpid());}return 0; }3.execvp 加载一个进程使用自定义环境变量env int execvp(const char*file, const char *argv[]); #includestdio.h #includeunistd.h #includestdlib.hint main(int argc,char *argv[]) {int i;pid_t pid; 创建子进程if(pid -1){perror(fork error);exit(1);}else if(pid 0){ //子进程//execlp(ls,-l,-d,-h,NULL);//execlp(date,date,NULL);//execl(./a.out,./a.out,linux,NULL);/************************************/char *argv[] {date,NULL};execvp(date,argv);/************************************/perror(exec error);exit(1);}else if(pid 0){ //父进程sleep(1);printf(Im parent : %d\n,getpid());}return 0; }4.exec函数族的一般规律 l:命令行参数列表 p:使用PATH环境变量 v:使用命令行参数数组 exec函数一旦调试成功即执行新的程序不返回。只要失败才返回错误值-1。所以通常我们直接在exec函数调用后调用 perror()和exit()。无需if判断。·  二、回收子进程 1.孤儿进程 父进程死亡子进程进孤儿院 孤儿进程:父进程先于子进程结束则子进程成为孤儿进程子进程的父进程成为init进程称为init进程领养孤儿进程。模拟孤儿进程 #include stdio.h #include unistd.h #include sys/wait.hint main(void) {pid_t pid;pid fork();if (pid 0) {while (1) {printf(I am child, my parent pid %d\n, getppid());sleep(1);}} else if (pid 0) {printf(I am parent, my pid is %d\n, getpid());sleep(9);printf(------------parent going to die------------\n);} else {perror(fork);return 1;}return 0; }查看进程状态ps ajx 进程孤儿院 1 2035 2035 2035 ? -1 Ss 1001 0:00 /lib/systemd/systemd --user解决方法 杀死子进程     kill -9 4871 2 .僵尸进程 子进程死亡父进程一直不管  僵尸进程:进程终止父进程尚未回收子进程残留资源PCB存放于内核中变成僵尸(zombie进程。死亡以后没有回收 特别注意僵尸进程是不能使用kill命令清除掉的。因为kill命令只是用来终止进程的而僵尸进程已经终止。 模拟僵尸进程 #include stdio.h #include stdlib.h #include unistd.h #include sys/wait.hint main(void) {pid_t pid;pid fork();if (pid 0) {printf(---child, my parent %d, going to sleep 10s\n, getppid());sleep(10);printf(-------------child die--------------\n);} else if (pid 0) {while (1) {printf(I am parent, pid %d, myson %d\n, getpid(), pid);sleep(1);}} else {perror(fork);return 1;}return 0; }查看进程状态ps ajx 解决方法 杀死父进程   kill -9 4770 *3.wait wait函数    回收子进程退出资源 阻塞回收任意一个。 pid_t wait(int *status) 参数传出 回收进程的状态。 返回值成功 回收进程的pid 失败 -1 errno 函数作用1    阻塞等待子进程退出 函数作用2    清理子进程残留在内核的 pcb 资源 函数作用3    通过传出参数得到子进程结束状态 获取子进程正常终止值 WIFEXITED(status) --》 为真 --》调用 WEXITSTATUS(status) --》 得到 子进程 退出值。 获取导致子进程异常终止信号 WIFSIGNALED(status) --》 为真 --》调用 WTERMSIG(status) --》 得到 导致子进程异常终止的信号编号。 #include stdio.h #include stdlib.h #include unistd.h #include sys/wait.hint main(void) {pid_t pid, wpid;int status;pid fork();if (pid 0) {printf(---child, my id %d, going to sleep 10s\n, getpid());sleep(10);printf(-------------child die--------------\n);return 73;} else if (pid 0) {//wpid wait(NULL); // 不关心子进程结束原因wpid wait(status); // 如果子进程未终止,父进程阻塞在这个函数上if (wpid -1) {perror(wait error);exit(1);}if (WIFEXITED(status)) { //为真,说明子进程正常终止. printf(child exit with %d\n, WEXITSTATUS(status));}if (WIFSIGNALED(status)) { //为真,说明子进程是被信号终止.printf(child kill with signal %d\n, WTERMSIG(status));}printf(------------parent wait finish: %d\n, wpid);} else {perror(fork);return 1;}return 0; }正常终止 被信号终止 *4.waitpid waitpid函数    指定某一个进程进行回收。可以设置非阻塞。           waitpid(-1, status, 0) wait(status); pid_t waitpid(pid_t pid, int *status, int options) 参数         pid指定回收某一个子进程pid 0: 待回收的子进程pid -1任意子进程 0同组的子进程。 status传出 回收进程的状态。 optionsWNOHANG 指定回收方式为非阻塞。 返回值 0 : 表成功回收的子进程 pid 0 : 函数调用时 参3 指定了WNOHANG 并且没有子进程结束。 -1: 失败。errno 回收任意子进程 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include pthread.h #include sys/wait.hint main(int argc,char *argv[]) {int i;pid_t pid,wpid;for(i 0;i 5;i){if(fork()0) //循环期间子进程不forkbreak;}if(i 5){ //父进程//wait(NULL);//一次wait/waitpid函数调用只能回收一个子进程/*****************************************/wpid waitpid(-1,NULL,WNOHANG);//回收任意子进程没有结束的子进程父进程直接返回0/****************************************/if(wpid -1){perror(waitpid error);exit(1);}printf(Im parent ,wait a child finish :%d\n,wpid);}else{ //子进程从break跳出sleep(i);printf(Im %dth child\n,i1);}return 0; }回收指定进程 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include pthread.h #include sys/wait.hint main(int argc,char *argv[]) {int i;pid_t pid,wpid,tmpid;for(i 0;i 5;i){pid fork();if(pid 0){ //循环期间子进程不forkbreak;}if(i 2){tmpid pid;printf(*************pid %d***************\n,pid);}}if(i 5){ //父进程,从表达式2跳出sleep(5); //设置睡眠等所有子进程结束后再回收//wait(NULL); //一次wait/waitpid函数调用只能回收一个子进程//wpid waitpid(-1,NULL,WNOHANG); //回收任意子进程没有结束的子进程父进程直接返回0printf(I am parent , before waitpid , pid %d\n,tmpid);/********将前面sleep(5)屏蔽***************///wpid waitpid(tmpid,NULL,0); //指定一个进程回收阻塞回收/****************************************//*****************************************/wpid waitpid(tmpid,NULL,WNOHANG); //指定一个进程回收不阻塞/****************************************/if(wpid -1){perror(waitpid error);exit(1);}printf(Im parent ,wait a child finish :%d\n,wpid); //wpid回收的是真正的子进程id}else{ //子进程从break跳出sleep(i);printf(Im %dth childpid %d\n,i1,getpid());}return 0; }注意 一次wait/waitpid调用只能回收一个子进程无法回收他孙子辈的进程多次清理需要while 5.waitpid回收多个子进程 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include pthread.h #include sys/wait.hint main(int argc,char *argv[]) {int i;pid_t pid,wpid;for(i 0;i 5;i){pid fork();if(pid 0){ //循环期间子进程不forkbreak;}}if(i 5){ //父进程/**********使用阻塞回收子进程********/while((wpid waitpid(-1,NULL,0))){printf(wait child %d\n,wpid);}/***********************************/}else{ //子进程sleep(i);printf(Im %dth child ,pid %d\n,i1,getpid());}return 0; }结束一个回收一个 之后返回-1表示没有失败了 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include pthread.h #include sys/wait.hint main(int argc,char *argv[]) {int i;pid_t pid,wpid;for(i 0;i 5;i){pid fork();if(pid 0){ //循环期间子进程不forkbreak;}}if(i 5){/*********使用阻塞回收子进程***********//*while((wpid waitpid(-1,NULL,0))){printf(wait child %d\n,wpid);}*//***********************************//*******使用非阻塞方式回收子进程******/while((wpid waitpid(-1,NULL,WNOHANG)) ! -1){if(wpid 0){ printf(wait child %d\n,wpid);}else if(wpid 0){sleep(1);continue;}/************************************/}}else{sleep(i);printf(Im %dth child ,pid %d\n,i1,getpid());}return 0; }
http://www.dnsts.com.cn/news/81519.html

相关文章:

  • 电影订票网站开发如何制作网页代码
  • 个旧建设局信息公开门户网站详情页设计制作
  • 个人网站建设心得体会龙华和龙岗哪个繁华
  • 合肥 电子商务 网站建设网站建设前端工具
  • 餐饮公司做网站好处西安企业网站seo
  • 营销型网站建设设计如何查网站备案号
  • 坪地网站建设效果南通网站开发价格
  • 晋城市公用事业建设局网站cn域名续费多少钱一年
  • 电子商务网站建设维护实训报告feed wordpress
  • 非遗网站建设目的厦门网站关键词优化
  • 物流网站建设策划书上海opencart网站建设
  • 常熟网站建设icp备案系统开发板价格
  • 网站建设服务费税率多少淘宝官方网站登录页面
  • 开发一个网站平台多少钱人力资源外包灵活用工
  • 网站搭建实训总结哈尔滨建设厅官方网站
  • 国外儿童社区网站模板湖南微网站营销
  • 网站备案的是空间还是域名手机怎么登pc端智慧团建
  • 网站建设解决方案ppt模板app 网站建设
  • 东莞网站高端建设网站升级改版需要几天
  • wordpress 免费电商主题站长工具推荐seo综合查询
  • 苏州网站公司如何做公众号微信推广
  • 酒店类网站建设开发书织梦cms侵权开庭
  • 做电商看的网站有哪些地方信息网站源码
  • 建网站卖虚拟资源需要怎么做如何建立一家公司
  • wordpress注册修改怎样优化自己的网站
  • 商城网站要多少钱wordpress app 加载慢
  • 长沙商城网站制作国外网站建设企业
  • 网站后台如何修改参数开个网站做英语培训
  • 现在做网站到底需要多少钱带积分的网站建设
  • 提高网站流量的软文案例网络营销案例论文