При создании программы оболочки я столкнулся с проблемой распознавания состояний процессов. Описание проблемы, с которой я столкнулся, заключается в том, что у меня есть список дочерних процессов, и я пытаюсь выяснить их состояние, используя waitpid
и WNOHANG
. Я хочу различать 3 состояния: TERMINATED
, RUNNING
и SUSPENDED
. (как определено в приведенном ниже коде) Я хочу изменить состояния процессов на одно из этих трех выше, однако прямо сейчас эта функция делает статусы запущенных процессов равными terminated
, и эта функция также не распознает приостановленные процессы. Я хотел бы знать, что я делаю неправильно и как должна быть написана функция updateProcessList
для ее достижения?
#define TERMINATED -1
#define RUNNING 1
#define SUSPENDED 0
typedef struct process{
cmdLine* cmd; /* the parsed command line*/
pid_t pid; /* the process id that is running the command*/
int status; /* status of the process: RUNNING/SUSPENDED/TERMINATED */
struct process *next; /* next process in chain */
} process;
void updateProcessList(process **process_list) {
process *p = *process_list;
int code = 0, status = 0,pidd = 0;
while (p) {
pidd = p->pid;
code = waitpid(pidd, &status, WNOHANG);
if (code == -1) { /* child terminated*/
p->status = TERMINATED;
} else if(WIFEXITED(status)){
p->status = TERMINATED;
}else if(WIFSTOPPED(status)){
p->status = SUSPENDED;
}
p = p->next;
}
}
TERMINATED
, даже когда процесс действительно запущен? И как вы останавливаете процесс, чтобы проверить состояниеSUSPENDED
? - person kaylum   schedule 08.05.2020RUNNING
? Покажите код как минимальный проверяемый пример. - person kaylum   schedule 08.05.2020RUNNING
, с этого момента его статус остается таким, какой он есть, до тех пор, пока не будет вызвана эта функция. Эта функция предназначена для изменения статусов процессов. - person Avi Ferdman   schedule 08.05.2020TERMINATED
? Делоif (code == -1)
? - person kaylum   schedule 08.05.2020