[Linux] 程序管理
阿新 • • 發佈:2020-10-29
/*** loop_wait.c ***/ #include <bits/stdc++.h> #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <unistd.h> // WARNING: Only signal-safe functions can be used in sig_handler. // static void sig_handler(int signo) { // if (signo == SIGCHLD) { // pid_t pid; // while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) { // } // } // signal(signo, sig_handler); // } int main(int argc, char *argv[]) { // signal(SIGCHLD, sig_handler); int n = 3, i; //預設建立3個子程序 pid_t p, q; std::set<pid_t> set; for (i = 0; i < n; i++) { //出口1,父程序專用出口 p = fork(); if (p == 0) { break; //出口2,子程序出口,i不自增 } else { set.insert(p); } } if (n == i) { // sleep(n); printf("I am parent, pid = %d\n", getpid(), getgid()); // pid_t pid = waitpid(q, NULL, WNOHANG); // pid_t pid = wait(NULL); // printf("child pid = %d\n", pid); while (!set.empty()) { auto it = set.begin(); while (it != set.end()) { auto pid = *it; int status; if ((pid = waitpid(pid, &status, WNOHANG)) != 0) { printf("clean OK! pid :%d status: %d\n", pid, status); set.erase(it++); } else { printf("pid still alive: %d\n", pid); ++it; } // if (kill(pid, 0) != -1) { // printf("pid still alive: %d", pid); // ++it; // } else { // printf("pid not alive, prepare for clean: %d\n", pid); // } } sleep(1); } } else { sleep(i); printf("I'm %dth child, pid = %d, gpid=%d\n", i + 1, getpid(), getgid()); exit(i); } return 0; }