<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] # 簡介 守護進程(Daemon Process),也就是通常說的 Daemon 進程(精靈進程),是 Linux 中的后臺服務進程。它是一個生存期較長的進程,通常獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件。一般采用以d結尾的名字。 守護進程是個特殊的孤兒進程,這種進程脫離終端,為什么要脫離終端呢?之所以脫離于終端是為了避免進程被任何終端所產生的信息所打斷,其在執行過程中的信息也不在任何終端上顯示。由于在 Linux 中,每一個系統與用戶進行交流的界面稱為終端,每一個從此終端開始運行的進程都會依附于這個終端,這個終端就稱為這些進程的控制終端,當控制終端被關閉時,相應的進程都會自動關閉。 Linux 的大多數服務器就是用守護進程實現的。比如,Internet 服務器 inetd,Web 服務器 httpd 等。 # 守護進程模型 1) 創建子進程,父進程退出(必須) * 所有工作在子進程中進行形式上脫離了控制終端 2) 在子進程中創建新會話(必須) * setsid()函數 * 使子進程完全獨立出來,脫離控制 3) 改變當前目錄為根目錄(不是必須) * chdir()函數 * 防止占用可卸載的文件系統 * 也可以換成其它路徑 4) 重設文件權限掩碼(不是必須) * umask()函數 * 防止繼承的文件創建屏蔽字拒絕某些權限 * 增加守護進程靈活性 5) 關閉文件描述符(不是必須) * 繼承的打開文件不會用到,浪費系統資源,無法卸載 6) 開始執行守護進程核心工作(必須) 守護進程退出處理程序模型 # 守護進程參考代碼 寫一個守護進程, 每隔2s獲取一次系統時間, 將這個時間寫入到磁盤文件: ~~~ /* * time_t rawtime; * time ( &rawtime ); --- 獲取時間,以秒計,從1970年1月一日起算,存于rawtime * localtime ( &rawtime ); //轉為當地時間,tm 時間結構 * asctime() // 轉為標準ASCII時間格式: */ void write_time(int num) { time_t rawtime; struct tm * timeinfo; // 獲取時間 time(&rawtime); #if 0 // 轉為本地時間 timeinfo = localtime(&rawtime); // 轉為標準ASCII時間格式 char *cur = asctime(timeinfo); #else char* cur = ctime(&rawtime); #endif ? // 將得到的時間寫入文件中 int fd = open("/home/edu/timelog.txt", O_RDWR | O_CREAT | O_APPEND, 0664); if (fd == -1) { perror("open error"); exit(1); } // 寫文件 int ret = write(fd, cur, strlen(cur) + 1); if (ret == -1) { perror("write error"); exit(1); } // 關閉文件 close(fd); } ? int main(int argc, const char* argv[]) { pid_t pid = fork(); if (pid == -1) { perror("fork error"); exit(1); } ? if (pid > 0) { // 父進程退出 exit(1); } else if (pid == 0) { // 子進程 // 提升為會長,同時也是新進程組的組長 setsid(); ? // 更改進程的執行目錄 chdir("/home/edu"); ? // 更改掩碼 umask(0022); ? // 關閉文件描述符 close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); ? // 注冊信號捕捉函數 //先注冊,再定時 struct sigaction sigact; sigact.sa_flags = 0; sigemptyset(&sigact.sa_mask); sigact.sa_handler = write_time; sigaction(SIGALRM, &sigact, NULL); ? // 設置定時器 struct itimerval act; // 定時周期 act.it_interval.tv_sec = 2; act.it_interval.tv_usec = 0; // 設置第一次觸發定時器時間 act.it_value.tv_sec = 2; act.it_value.tv_usec = 0; // 開始計時 setitimer(ITIMER_REAL, &act, NULL); ? // 防止子進程退出 while (1); } ? return 0; } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看