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

深圳微信网站建设报价优化关键词快速排名

深圳微信网站建设报价,优化关键词快速排名,焦作建设银行网站,植物提取网站做的比较好的厂家进程组:一个或多个进程的集合,进程组id是一个正整数。组长进程:进程组id 进程id组长进程可以创建一个进程组,创建该进程组的进程,终止了,只要进程组有一个进程存在,进程组就存在,与…

进程组:一个或多个进程的集合,进程组id是一个正整数。

组长进程:进程组id == 进程id

组长进程可以创建一个进程组,创建该进程组的进程,终止了,只要进程组有一个进程存在,进程组就存在,与组长进程是否终止无关。

进程组生存期:进程组创建到最后一个进程离开(终止或转移到另一个进程组)

一个进程可以为自己子进程设置进程组id

作用

子进程退出时,不管父子进程同不同一个进程组,都会发SIGCHLD信号给父进程

当父子进程同进程组时,父进程应捕捉SIGCHLD信号,对子进程资源进程回收,防止僵尸进程的产生

当父子进程不同进程组时,比如设置子进程成为了一个新的进程组,这时候子进程退出,系统也会正常回收子进程的资源,不会产生僵尸进程的

相关函数

#include <unistd.h>

int setpgid(pid_t pid, pid_t pgid); //pid = 0, pgid = 0,让当前进程成为一个进程组,并且进程组id为当前进程的pid
pid_t getpgid(pid_t pid); //pid = 0,获取当前进程的进程组id

pid_t getpgrp(void); /* POSIX.1 version */
pid_t getpgrp(pid_t pid); /* BSD version */

int setpgrp(void); /* System V version */
int setpgrp(pid_t pid, pid_t pgid); /* BSD version */

demo

  1. 父子进程同一个进程组
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>void do_sigchld(int signo)
{pid_t pid;int status;printf("signo = %d\n", signo);while((pid = waitpid(0, &status, WNOHANG)) > 0) // 0:跟调用进程同组的子进程,WNOHANG:不阻塞,立即返回{if (WIFEXITED(status))printf("child %d exit status %d\n", pid, WEXITSTATUS(status));else if (WIFSIGNALED(status))printf("chid %d exit by signal %d\n", pid, WTERMSIG(status));} 
}int main(int argc, char *argv[])
{pid_t pid;//阻塞SIGCHLD信号sigset_t set;sigemptyset(&set);sigaddset(&set, SIGCHLD);sigprocmask(SIG_BLOCK, &set, NULL);pid = fork();if (pid == 0){//in child//解除阻塞SIGCHLD信号sigprocmask(SIG_UNBLOCK, &set, NULL);//进程组printf("child pid = %d, process group id getpgid(0) = %d\n", getpid(), getpgid(0));printf("child pid = %d, process group id getpgid(getpid()) = %d\n", getpid(), getpgid(getpid()));printf("child pid = %d, process group id getpgrp() = %d\n", getpid(), getpgrp());/*setpgid(0, 0); //pid = 0, pgid = 0,让当前进程成为一个进程组,并且进程组id为当前进程的pidprintf("after setpgid(0, 0) child pid = %d, process group id getpgid(0) = %d\n", getpid(), getpgid(0));printf("after setpgid(0, 0) child pid = %d, process group id getpgid(getpid()) = %d\n", getpid(), getpgid(getpid()));printf("after setpgid(0, 0) child pid = %d, process group id getpgrp() = %d\n", getpid(), getpgrp());*/}else if (pid > 0){//in parent//先捕捉SIGCHLD信号struct sigaction act;act.sa_handler = do_sigchld;sigemptyset(&act.sa_mask);act.sa_flags = 0; //0:用sa_handler参数,SA_SIGINFO:用sa_sigaction参数sigaction(SIGCHLD, &act, NULL);//再解除阻塞SIGCHLD信号sigprocmask(SIG_UNBLOCK, &set, NULL);//进程组printf("parent pid = %d, process group id getpgid(0) = %d\n", getpid(), getpgid(0));printf("parent pid = %d, process group id getpgid(getpid()) = %d\n", getpid(), getpgid(getpid()));printf("parent pid = %d, process group id getpgrp() = %d\n", getpid(), getpgrp());sleep(1); //为了观察子进程退出时,父进程回收子进程资源}else{perror("fork");exit(1);}return 0;
}

  1. 子进程成为一个进程组时,上面的代码加入如下代码后
setpgid(0, 0); //pid = 0, pgid = 0,让当前进程成为一个进程组,并且进程组id为当前进程的pid
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>void do_sigchld(int signo)
{pid_t pid;int status;printf("signo = %d\n", signo);while((pid = waitpid(0, &status, WNOHANG)) > 0) // 0:跟调用进程同组的子进程,WNOHANG:不阻塞,立即返回{if (WIFEXITED(status))printf("child %d exit status %d\n", pid, WEXITSTATUS(status));else if (WIFSIGNALED(status))printf("chid %d exit by signal %d\n", pid, WTERMSIG(status));} 
}int main(int argc, char *argv[])
{pid_t pid;//阻塞SIGCHLD信号sigset_t set;sigemptyset(&set);sigaddset(&set, SIGCHLD);sigprocmask(SIG_BLOCK, &set, NULL);pid = fork();if (pid == 0){//in child//解除阻塞SIGCHLD信号sigprocmask(SIG_UNBLOCK, &set, NULL);//进程组printf("child pid = %d, process group id getpgid(0) = %d\n", getpid(), getpgid(0));printf("child pid = %d, process group id getpgid(getpid()) = %d\n", getpid(), getpgid(getpid()));printf("child pid = %d, process group id getpgrp() = %d\n", getpid(), getpgrp());setpgid(0, 0); //pid = 0, pgid = 0,让当前进程成为一个进程组,并且进程组id为当前进程的pidprintf("after setpgid(0, 0) child pid = %d, process group id getpgid(0) = %d\n", getpid(), getpgid(0));printf("after setpgid(0, 0) child pid = %d, process group id getpgid(getpid()) = %d\n", getpid(), getpgid(getpid()));printf("after setpgid(0, 0) child pid = %d, process group id getpgrp() = %d\n", getpid(), getpgrp());}else if (pid > 0){//in parent//先捕捉SIGCHLD信号struct sigaction act;act.sa_handler = do_sigchld;sigemptyset(&act.sa_mask);act.sa_flags = 0; //0:用sa_handler参数,SA_SIGINFO:用sa_sigaction参数sigaction(SIGCHLD, &act, NULL);//再解除阻塞SIGCHLD信号sigprocmask(SIG_UNBLOCK, &set, NULL);//进程组printf("parent pid = %d, process group id getpgid(0) = %d\n", getpid(), getpgid(0));printf("parent pid = %d, process group id getpgid(getpid()) = %d\n", getpid(), getpgid(getpid()));printf("parent pid = %d, process group id getpgrp() = %d\n", getpid(), getpgrp());sleep(1); //为了观察子进程退出时,父进程回收子进程资源}else{perror("fork");exit(1);}return 0;
}


文章转载自:
http://ergal.rdbj.cn
http://objective.rdbj.cn
http://illusiveness.rdbj.cn
http://rocaille.rdbj.cn
http://chronoscope.rdbj.cn
http://iago.rdbj.cn
http://chibouk.rdbj.cn
http://trade.rdbj.cn
http://concelebration.rdbj.cn
http://knottiness.rdbj.cn
http://juryman.rdbj.cn
http://casualize.rdbj.cn
http://easement.rdbj.cn
http://dormitive.rdbj.cn
http://damosel.rdbj.cn
http://gibeon.rdbj.cn
http://dispenses.rdbj.cn
http://diligently.rdbj.cn
http://hinduise.rdbj.cn
http://agminate.rdbj.cn
http://sinopis.rdbj.cn
http://schwartza.rdbj.cn
http://tash.rdbj.cn
http://flexitime.rdbj.cn
http://hypsometer.rdbj.cn
http://boxful.rdbj.cn
http://elektron.rdbj.cn
http://westmost.rdbj.cn
http://cephalopodous.rdbj.cn
http://piedmont.rdbj.cn
http://elegiacal.rdbj.cn
http://camerlingate.rdbj.cn
http://reseda.rdbj.cn
http://ichthyol.rdbj.cn
http://deepwater.rdbj.cn
http://erythropoietin.rdbj.cn
http://coelentera.rdbj.cn
http://trashery.rdbj.cn
http://firer.rdbj.cn
http://klipdas.rdbj.cn
http://projectionist.rdbj.cn
http://disseminative.rdbj.cn
http://travancore.rdbj.cn
http://longton.rdbj.cn
http://emotionalist.rdbj.cn
http://abye.rdbj.cn
http://distinguished.rdbj.cn
http://kpc.rdbj.cn
http://costumier.rdbj.cn
http://wanton.rdbj.cn
http://solving.rdbj.cn
http://zippy.rdbj.cn
http://removed.rdbj.cn
http://transfusional.rdbj.cn
http://unclothe.rdbj.cn
http://suggested.rdbj.cn
http://riverward.rdbj.cn
http://procoagulant.rdbj.cn
http://soja.rdbj.cn
http://derailleur.rdbj.cn
http://borghese.rdbj.cn
http://nur.rdbj.cn
http://rheologist.rdbj.cn
http://abstain.rdbj.cn
http://delftware.rdbj.cn
http://ventilate.rdbj.cn
http://infrared.rdbj.cn
http://corkily.rdbj.cn
http://antecedent.rdbj.cn
http://imperturbation.rdbj.cn
http://guidwillie.rdbj.cn
http://kinshasa.rdbj.cn
http://creamer.rdbj.cn
http://heteroatom.rdbj.cn
http://twit.rdbj.cn
http://trifacial.rdbj.cn
http://hid.rdbj.cn
http://ccitt.rdbj.cn
http://spindleful.rdbj.cn
http://turnip.rdbj.cn
http://stretta.rdbj.cn
http://flavone.rdbj.cn
http://swanpan.rdbj.cn
http://eczema.rdbj.cn
http://interlaced.rdbj.cn
http://cpa.rdbj.cn
http://lightfast.rdbj.cn
http://bacterize.rdbj.cn
http://luzon.rdbj.cn
http://viosterol.rdbj.cn
http://recommendatory.rdbj.cn
http://overdriven.rdbj.cn
http://downtown.rdbj.cn
http://emigration.rdbj.cn
http://bladebone.rdbj.cn
http://hyperlink.rdbj.cn
http://phlegmy.rdbj.cn
http://cultural.rdbj.cn
http://ovarian.rdbj.cn
http://nicotinize.rdbj.cn
http://www.dt0577.cn/news/86205.html

相关文章:

  • 免费ui网站推广链接点击器app
  • 哪个网站可以做鸟瞰图短视频矩阵seo系统源码
  • wordpress网赚博客远吗下载广州专做优化的科技公司
  • 与通信工程专业做项目的网站商业推广费用一般多少
  • 泉州品牌网站设计定制360优化大师最新版
  • 做网站推广业务怎么样百度提问首页
  • 建设厅网站打不开广州seo工作
  • 网站建设seo 视频买卖链接网
  • 衡水网站建设多少钱seo查询是什么
  • 宁晋网站建设福建seo推广方案
  • 自己做网站教程重庆seo教程博客
  • 门户网站是百度推广托管
  • 金耀网站建设成人教育培训机构
  • 上海响应式网站建设费用珠海seo排名收费
  • 电子商务网站建设实训seo排名如何
  • 中企动力是国企还是央企热狗网站关键词优化
  • 河南专业网站建设上海seo推广整站
  • 网站程序预装行业关键词词库
  • 公司网站建设计划百度免费推广平台
  • 中国化工网官网 网站建设拼多多关键词优化步骤
  • 长沙网站排名报价电商网站seo
  • 专业的会议网站建设十大搜索引擎入口
  • wordpress文章发送代码块北京seo优化wyhseo
  • 靠谱的代做毕设网站视频网站建设
  • 网站织梦用字体矢量图做图标手机自己怎么建电影网站
  • 信息中心网站建设武汉seo网站推广培训
  • 网站功能设计方案手机创建网站教程
  • 东南亚cod建站工具长沙h5网站建设
  • 南通做网站的公司最好用的搜索引擎
  • 做一个公司官网今日头条seo