При создании программы оболочки я столкнулся с проблемой распознавания состояний процессов. Описание проблемы, с которой я столкнулся, заключается в том, что у меня есть список дочерних процессов, и я пытаюсь выяснить их состояние, используя waitpid
и WNOHANG
. Я использую sh, чтобы различать guish между 3 состояниями: TERMINATED
, RUNNING
и SUSPENDED
. (как определено в приведенном ниже коде) Я использую sh, чтобы изменить состояния процессов на одно из этих трех выше, однако прямо сейчас эта функция делает статус запущенных процессов 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;
}
}