jctank
jctank

Reputation: 181

Determine if a process has suspended

I try to send a SIGTSTP signal to a particular process, but how to determine if the process has actually suspended using C library functions or syscalls in Linux?

Upvotes: 3

Views: 2639

Answers (2)

Kanor
Kanor

Reputation: 81

I know this is an old post, but for anyone who as curious as me!

The simple answer is that there is only one STATIC, consistent way to check status, which is from /proc/[pid]/stat, BUT if you want to have as few architecture dependencies as possible and don't want to do that, you can check the signal.

Signals can only be seen once, so you'll have to keep track of it yourself, but waitpid can tap a process to see if any signals have been received since you last checked:

    BOOL is_suspended;
    int status;
    pid_t result = waitpid(pid, &status, WNOHANG | WUNTRACED | WCONTINUED);

    if(result > 0) { // Signal has been received
        if (WIFSTOPPED(status)) {
            is_suspended = true;
        } else if (WIFCONTINUED(status)) {
            is_suspended = false;
        }
    }

Upvotes: 1

Anthony
Anthony

Reputation: 12397

Read from /proc/[pid]/stat.

From the man page, you can get the status of a process from this file:

state %c

One character from the string "RSDZTW" where R is running, S is sleeping in an interruptible wait, D is waiting in uninterruptible disk sleep, Z is zombie, T is traced or stopped (on a signal), and W is paging.

Upvotes: 6

Related Questions