Waitpid equivalent with timeout?

前端 未结 10 1282
小鲜肉
小鲜肉 2020-11-27 12:10

Imagine I have a process that starts several child processes. The parent needs to know when a child exits.

I can use waitpid, but then if/when the paren

10条回答
  •  眼角桃花
    2020-11-27 12:47

    Instead of calling waitpid() directly, you could call sigtimedwait() with SIGCHLD (which would be sended to the parent process after child exited) and wait it be delived to the current thread, just as the function name suggested, a timeout parameter is supported.

    please check the following code snippet for detail

    
    static bool waitpid_with_timeout(pid_t pid, int timeout_ms, int* status) {
        sigset_t child_mask, old_mask;
        sigemptyset(&child_mask);
        sigaddset(&child_mask, SIGCHLD);
    
        if (sigprocmask(SIG_BLOCK, &child_mask, &old_mask) == -1) {
            printf("*** sigprocmask failed: %s\n", strerror(errno));
            return false;
        }
    
        timespec ts;
        ts.tv_sec = MSEC_TO_SEC(timeout_ms);
        ts.tv_nsec = (timeout_ms % 1000) * 1000000;
        int ret = TEMP_FAILURE_RETRY(sigtimedwait(&child_mask, NULL, &ts));
        int saved_errno = errno;
    
        // Set the signals back the way they were.
        if (sigprocmask(SIG_SETMASK, &old_mask, NULL) == -1) {
            printf("*** sigprocmask failed: %s\n", strerror(errno));
            if (ret == 0) {
                return false;
            }
        }
        if (ret == -1) {
            errno = saved_errno;
            if (errno == EAGAIN) {
                errno = ETIMEDOUT;
            } else {
                printf("*** sigtimedwait failed: %s\n", strerror(errno));
            }
            return false;
        }
    
        pid_t child_pid = waitpid(pid, status, WNOHANG);
        if (child_pid != pid) {
            if (child_pid != -1) {
                printf("*** Waiting for pid %d, got pid %d instead\n", pid, child_pid);
            } else {
                printf("*** waitpid failed: %s\n", strerror(errno));
            }
            return false;
        }
        return true;
    }
    

    Refer: https://android.googlesource.com/platform/frameworks/native/+/master/cmds/dumpstate/DumpstateUtil.cpp#46

提交回复
热议问题