中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

守護進程的創建方法與步驟

       守護進程是運行在后臺的一種特殊進程。它獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件。守護進程是一種很有用的進程,Linux的大多服務器就是用守護進程實現的。

郊區ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創新互聯公司的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

       守護進程的創建步驟:

              1.使進程在后臺運行(創建子進程,父進程退出)

                 if((pid=fork())>0)

                      exit(0);

                 else if (pid<0)

                  {

                         perror("fail to fork");

                         exit(-1);

                   }

               2.脫離控制終端,登錄會話和進程組(創建新會話)

                 進程屬于一個進程組,進程組號進程組長的進程號。一個會話可以包含多個進程組,這些進程組共享一個控制終端,這個控制終端通常是創建進程的登錄終端。控制終端,會話和進程組通常是從父進程繼承下來的。我們的目的就是要擺脫他們,使之不受他們的影響。方法是在第一點的基礎上,調用setsid()使進程成為會話組長:

                 setsid();

               說明:當進程是會話組長時setsid()調用失敗。但第一點已經保證進程不是會話組長。setsid()調用成功后,進程成為新的會話組長和新的進程組長,并與原來的登錄會話和進程組脫離。由于會話過程對進程的獨占性,進程同時與控制終端脫離。

             3.禁止進程重新打開控制終端

                現在進程已成為無終端的會話組長,但它可以重新申請打開一個控制終端。可以通過使進程不在成為會話組長來禁止進程從新打開控制終端:

                 if(pid=fork())

                      exit(0);  //結束第一子進程,第二子進程不在是會話組長

             4.關閉所有文件描述符

                進程從創建它的父進程那里繼承了打開的文件描述符。如不關閉,將會浪費系統資源,以及無法預料的錯誤。

               close(0);

               close(1);

               close(2);

             5.改變當前工作目錄:

                進程活動時,其工作目錄所在的文件系統不能卸下。一般需要將工作目錄改變到根目錄。

               chdir("\");

             6.重設權限掩碼:

                進程從創建它的父進程那里繼承了文件創建掩碼。它可能修改守護進程所創建的文件的存取位。為防止這一點,我們要將文件創建掩碼清除:

                umask(0);

             7.處理SIGCHLD信號:

                處理SIGCHLD信號并不是必須的。但對于某些進程,特別是服務器進程往往在請求到來時生成子進程處理請求。如果父進程不等待子進程結束,子進程將成為僵尸進程,從而占用系統資源。如果父進程等待子進程的結束,將增加父進程的負擔,影響服務器進程的并發性能。

               signal(SIGCHLD,SIG_IGN);

下面我們來看具體的代碼:(模擬實現簡單的守護進程)

  
  my_daemon.c文件

   #include <stdio.h>
   #include <stdlib.h>
   #include <signal.h>
   #include <unistd.h>
  
  void my_daemon()
  {
      umask(0);
      pid_t id1=fork();
      if(id1<0)
      {
          perror("fork");                                                                                                                                             
          exit(1);
      }
      if(id1>0)
      {
          exit(0);
      }
  
      setsid();
      pid_t id2=fork();
      if(id2<0)
      {
          perror("fork");
          exit(1);
      }
      if(id2>0)
      {
          exit(0);
      }
  
      signal(SIGCHLD,SIG_IGN);
      chdir("/");
      close(0);
      close(1);
      close(2);
  }  
  int main()

  {
      my_daemon();
      while(1)
      {}
      return 0;                                                                                                                              
  }

運行結果結果如下:

守護進程的創建方法與步驟

我們可以看到有個進程號為1的進程,證明我們生成了守護進程。

下面是一個相對而言比較完整的守護進程,這個守護進程每隔一定時間向daemon.log文件輸出時間信息:

   #include <stdio.h>
   #include <stdlib.h>
   #include <signal.h>
   #include <unistd.h>
   #include <time.h>
   #include <sys/types.h>
   #include <sys/stat.h>
  
  void my_daemon()
  {
      umask(0);
      pid_t id1=fork();
      if(id1<0)
      {
          perror("fork");
          exit(1);
      }
      if(id1>0)
      {
          exit(0);
      }
                                                                                                                                             
      setsid();
      pid_t id2=fork();
      if(id2<0)
      {
          perror("fork");
          exit(1);                                                                                                                           
      }
      if(id2>0)
      {
          exit(0);
      }
  
      signal(SIGCHLD,SIG_IGN);
      chdir("/");
      close(0);
      close(1);
      close(2);
  }
  
  int main()
  {
      FILE* fp;
      time_t t;
      fp=fopen("daemon.log","a");
      char *buf="hello bit";
      my_daemon();
      while(1)
      

      while(1)
      {
          sleep(1);
          t=time(0);
          fprintf(fp,"this is a daemon: %s",asctime(localtime(&t)));
      }                                                                                                                                      
      fclose(fp);
      return 0;
  }
  
                                          

                                          

                                 

標題名稱:守護進程的創建方法與步驟
文章路徑:http://www.2m8n56k.cn/article44/ipciee.html

成都網站建設公司_創新互聯,為您提供靜態網站微信小程序品牌網站建設全網營銷推廣網站制作自適應網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

商城網站建設
主站蜘蛛池模板: 欧美在线一区二区三区精品 | 国产精品毛片一区 | www.黄色免费网站 | 国产性tv国产精品 | 日韩在线一区二区三区视频 | 国产成人ay手机在线观看 | 国产亚洲精品一区二区在线播放 | 欧美性猛交xxxxxxxx软件 | 国产在线精品福利91香蕉 | 成人免费网站 | 一级二级三级毛片 | 加勒比综合在线 | 日韩高清在线播放不卡 | 免费看一级欧美激情毛片 | 她也啪在线视频 | 韩国免又爽又刺激激情视频 | 亚洲第一视频网站 | 亚洲专区视频 | 日本三级午夜 | 久久99国产亚洲高清观看韩国 | 亚洲手机在线观看 | 欧美高清性刺激毛片 | 一级毛片免费在线观看网站 | 亚洲综合精品一区二区三区中文 | 久久久久久久久久久久久久久久久久 | 我看毛片 | 欧美性久久久久 | 精品国产三级a∨在线观看 精品国产三级a在线观看 | 成人免费网站在线观看 | 日韩一级精品视频在线观看 | 91热成人精品国产免费 | 日本不卡不码高清免费观看 | 全部免费a级毛片 | 久久综合网址 | 日韩黄色视屏 | 成年人精品视频 | 欧美一区二区三区在观看 | 久草免费资源在线 | 亚洲视频在线免费观看 | 特色一级片 | 亚洲精品一区二区三区 |