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

厦门 网站建设 网站开发wordpress 编辑权限 发文章

厦门 网站建设 网站开发,wordpress 编辑权限 发文章,南京市工程建设交易中心网站,东莞企业名录大全守护(Daemon)进程又叫作“精灵进程”#xff0c;虽然守护进程这个名字更为常用#xff0c;但是个人感觉还是精灵进程较为机灵可爱些。服务器进程一般都是守护进程#xff0c;这类进程的一个显著特点就是无交互地在后台进程。注意#xff1a;这里所说的无交互并不是说真的不…守护(Daemon)进程又叫作“精灵进程”虽然守护进程这个名字更为常用但是个人感觉还是精灵进程较为机灵可爱些。服务器进程一般都是守护进程这类进程的一个显著特点就是无交互地在后台进程。注意这里所说的无交互并不是说真的不能和这类进程打交道不能控制其运行那样他们还能提供什么服务而是说不能通过传统的终端用类似shell的交互方式控制其运行。那么怎么创建守护进程呢咋们就边看代码边讲解。12  #include 3  #include 4  #include 5  #include 6  #include 7  #include 8  #include 9  #include 10  #include 11  #include 12  #include 13  #include 14  #include 151-15行: 加载必要的头文件其实这些头文件并不是随意罗列的而是当需要时再添加具体方法是需要调用某个库函数或者系统调用时用man查找它被定义的头文件的路径然后添加之。如果在编译的时候显示某个函数没有被定义的错误这时也可以用man查找所需的头文件之所在。有的时候甚至需要用grep到/usr/include目录下面查找变量或者函数的定义。16  void daemonize(const char *prgname, ...)17  {18          va_list args;19          char buf[512];20          int pid, i;21          struct sigaction act, oldact;22          struct rlimit lim;2324          /* Detach controlling terminal */25          if ((pid fork()) 0)26                  exit(1);27          else if (pid 0)28                  _exit(0);29          setsid();3025-29行从当前进程fork出一个子进程然后当前进程退出。如果当前进程是shell从前台启动的的话当当前进程退出的时候子进程将变成孤儿进程接着自动被启动进程(init)收养当然它所在的进程组也将从前台转为后台。调用完setsid()之后子进程将创建一个新的会话和进程组sid和gpid都是子进程的pid因为子进程已经和当前进程不属于一个会话那么与会话相关联的控制终端也不复存在。如果你足够细心你可能注意到了这段代码中用了两个进程退出函数exit和_exit为什么要如此呢_exit并不会执行由atexit或者on_exit注册的进程退出回调函数除此之外它和exit并没有区别。假设用户在调用daemonize把当前进程守护化之前注册过进程退出回调函数如果fork成功而当前进程通过调用exit退出那么回调函数将被执行而这时执行回调函数也许是不当的因为子进程并没有退出当子进程退出的时候也许还将执行一遍回调函数。exit和_exit的选用正是为了保证进程退出回调函数被且尽被执行一次。以下对exit和_exit的选用也是基于此目的遇到时将不再赘述。事实上daemonize函数应该尽早调用最好不要再其前面做太多的非必要操作类似注册进程退出回调函数的举动应该尽量避免。31          /* Avoid owning controlling terminal again */32          memset(act, 0, sizeof(act));33          act.sa_handler SIG_IGN;34          sigemptyset(act.sa_mask);35          sigaction(SIGHUP, act, oldact);36          if ((pid fork()) 0)37                  exit(1);38          else if (pid 0)39                  _exit(0);40          /* Wait for the death of its parent. */41          while (getppid() ! 1)42                  ;43          sigaction(SIGHUP, oldact, NULL);4431-43行这段代码的意义何在呢有些UNIX操作系统(如SVR4)的会话首进程打开一个终端设备时如果其所在会话组并没有控制终端那么这个终端设备将自动成为这个会话组的控制终端。通过这次的fork而产生的孙子进程因为不是会话首进程也就失去了为此会话设置控制终端的能力。当会话首进程退出的时候可能向其所在会话组的所有进程发送SIGHUP信号而SIGHUP信号的默认处理函数是结束进程。为了防止孙子进程因此意外结束忽略SIGHUP信号直到子进程退出孙子进程被启动进程(init)收养。我查看了Linux内核的相关代码发现只有当进程被SIGSTP终止时才会被发送SIGHUP和SIGCONT信号所以此段关于信号的处理部分在Linux下是无效的也许其他操作系统行为有异姑且加之。45          /* Deal with file operations */46          umask(0);47          if (chdir(/) 0)48                          exit(1);49          if (getrlimit(RLIMIT_NOFILE, lim) 0)50                  exit(1);51          if (lim.rlim_cur RLIM_INFINITY)52                  lim.rlim_cur 1024;53          for (i 0; i lim.rlim_cur; i ) {54                  if (close(i) 0 errno ! EBADF)55                          exit(1);56          }57          if (open(/dev/null, O_RDWR) 058                          || dup(0) 059                          || dup(0) 0)60                  exit(1);6145-60行设置文件掩码为0,改变当前工作目录到系统根目录关闭所有打开的文件描述符并把标准输入、标准输出和标准错误输出重定向到空设备(/dev/null)使他们保持沉默。62          /* Ignore all traditional signals */63          for (i 1; i 32; i )64                  sigaction(i, act, NULL);6562-65行忽略所有的传统信号当然SIGKILL信号是无法忽略的所以我也没有检查返回值。按照设计惯例SIGHUP用来热更新系统配置;SIGTERM用来结束进程这个信号一般是需要捕捉并处理的不然被SIGKILL强制杀死的滋味可不好受哦。(修正62-65行的操作最好免除因为大部分信号是不希望被忽略的如SEGV)。66          /* Initialize the log file */67          va_start(args, prgname);68          vsnprintf(buf, sizeof(buf), prgname, args);69          va_end(args);70          openlog(buf, LOG_CONS | LOG_PID, LOG_DAEMON);71  }7266-71行一般的服务器都需要用日志(log)记录守护进程的状态等信息以备分析和调试之用这段代码就是打开到系统日志服务器(syslogd)的连接并设置记录守护进程的进程名和pid。至此进程的守护化就顺利完成了。服务器程序一般都具有排他性换句话说就是一个操作系统上只允许有一个守护进程实例存在。以下代码实现了这个功能96 int uniqued(const char *prgname)97 {98         char buf[512];99         int fd, retval -1;100101         assert(prgname ! NULL);102         snprintf(buf, sizeof(buf), /var/run/%s.pid, prgname);103         if ((fd open(buf, O_RDWR | O_CREAT)) 0)104                 goto out;105         if (flock(fd, LOCK_EX | LOCK_NB) 0) {106                 if (errno EWOULDBLOCK)107                         retval 0;108                 else109                         unlink(buf);110                 goto err;111         }112         if (ftruncate(fd, 0) 0)113                 goto err;114         snprintf(buf, sizeof(buf), %ld\n, (long)getpid());115         if (write(fd, buf, strlen(buf)) ! strlen(buf))116                 goto err;117         retval fd;118119 out:120         return retval;121122 err:123         while (close(fd) 0 errno EINTR)124                 ;125         goto out;126 }遵从惯例记录有守护进程进程号的文件被放在/var/run/目录下并被命名为:守护进程名.pid。函数uniqued利用排他文件锁保证了守护进程实例的单一性。
http://www.zqtcl.cn/news/768444/

相关文章:

  • 重庆网站建设方案书国外做电商平台的网站有什么
  • 微信扫一扫登录网站如何做网络平台怎么弄
  • 怎么做网页模板展示网站株洲网红餐厅
  • 优秀学校网站设计正规抖音代运营公司排名
  • 网站的网站建设公司太原中小企业网站制作
  • 北京网站建设搜q.479185700模特公司网站模板
  • 网站设置什么意思wordpress 专题页面
  • 网站推广要具备什么购物网站多少钱
  • 重庆免费做网站在线做ppt
  • wordpress固定链接设置404阳江seo优化
  • 响应网站模板下载wordpress恢复网站
  • 公司网站建设的定位语要怎么取网站开发中常见的注册界面
  • 免费企业查询网站wordpress侧边栏加载过慢
  • 网站写好了怎么做后台管理链接是什么意思
  • 低价格制作网站wordpress 注册用户
  • 免费发布租房信息网站wordpress页面回收站
  • 长网页网站信息技术教案 建设我们的网站
  • 免费网站建设可信吗wordpress divi布局
  • 网站百度不收录wordpress偽靜態
  • 沈阳php网站建网站需要学什么
  • WordPress多站点绑定域名百度帐号注册
  • 网站营销队伍网站建设明薇通网络
  • 做网站的公司重庆万网x5 wordpress
  • 印刷设计营销网站网站设置成黑白
  • 百度自助建站官网上海徐汇网站建设
  • 网站定制 北京贵阳网站建设公司哪家好
  • 如何做logo模板下载网站企业策划
  • 合肥做网站的公司讯登欧亚达网站是哪家公司做的
  • 网站模板带有sql后台下载企业网站建设平台的功能
  • 网站推广的实际案例电子商务网站建设的要求