this 이전 질문 나는 내 자신의 쉘 코드의 대부분을 올렸다. 내 다음 단계는 포 그라운드 및 백그라운드 프로세스 실행을 구현하고 종료 할 수 있도록 적절하게 기다려 "좀비"로 머 무르지 않는 것입니다.C의 자체 쉘에서 포어 그라운드/백그라운드 프로세스를 제대로 대기하는 방법은 무엇입니까?
백그라운드에서 실행할 가능성을 추가하기 전에 모든 프로세스가 포 그라운드에서 실행되고있었습니다. 그리고이를 위해 간단히 execvp()로 프로세스를 실행 한 후 wait (NULL)을 호출했습니다. 이제 마지막 인수로 '&'문자를 확인하고 거기에 있다면 wait (NULL)을 호출하지 않고 백그라운드에서 프로세스를 실행하고 프로세스가 백그라운드에서 행복하게 실행되어 쉘에 반환됩니다.
이것은 제대로 작동하고 있습니다. 이제 문제는 백그라운드 프로세스가 "좀비"가되지 않도록 wait() (또는 waitpid()?)를 호출해야한다는 것입니다. 그게 내 문제 야, 어떻게해야할지 모르겠다.
나는 SIGCHLD를 처리해야만한다고 믿는다. 그러나 나는 또한 SIGCHLD 신호가 보내 졌을 때 아직 완전히 이해하지 못했다. childSignalHandler()에 대기 (NULL)를 추가하지만 백그라운드에서 프로세스를 실행하자마자 childSignalHandler() 함수가 호출되어 결과적으로 대기 (NULL), 즉 아무 것도 할 수 없음을 의미하므로 "배경"프로세스가 끝날 때까지 내 셸로. 신호 처리기에서 대기 때문에 더 이상 백그라운드에서 실행되지 않았습니다.
이 모든 것이 누락 되었습니까?
마지막으로,이 실습의 일부인 프로세스 종료와 같은 프로세스 상태의 변경 사항을 인쇄해야합니다. 그래서, 그것에 대한 어떤 통찰력도 정말로 감사합니다.
이 순간에 내 전체 코드는 다음과 같습니다
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wait.h>
#include <signal.h>
#include <sys/types.h>
#include "data.h" // Boolean typedef and true/false macros
void childSignalHandler(int signum) {
//
}
int main(int argc, char **argv) {
char bBuffer[BUFSIZ], *pArgs[10], *aPtr = NULL, *sPtr;
bool background;
ssize_t rBytes;
int aCount;
pid_t pid;
//signal(SIGINT, SIG_IGN);
signal(SIGCHLD, childSignalHandler);
while(1) {
write(1, "\e[1;31mmyBash \e[1;32m# \e[0m", 27);
rBytes = read(0, bBuffer, BUFSIZ-1);
if(rBytes == -1) {
perror("read");
exit(1);
}
bBuffer[rBytes-1] = '\0';
if(!strcasecmp(bBuffer, "exit")) {
exit(0);
}
sPtr = bBuffer;
aCount = 0;
do {
aPtr = strsep(&sPtr, " ");
pArgs[aCount++] = aPtr;
} while(aPtr);
background = FALSE;
if(!strcmp(pArgs[aCount-2], "&")) {
pArgs[aCount-2] = NULL;
background = TRUE;
}
if(strlen(pArgs[0]) > 1) {
pid = fork();
if(pid == -1) {
perror("fork");
exit(1);
}
if(pid == 0) {
execvp(pArgs[0], pArgs);
exit(0);
}
if(!background) {
wait(NULL);
}
}
}
return 0;
}
감사합니다.하지만 신호 처리기를 사용해야합니다. 실제로는 운동의 일부입니다. –
방금 편집을 보았습니다 ... 신호 처리기에 waitpid()를 넣었지만 두 번째 단락에서 설명하는 문제가 있습니다. 난 그냥 문제를 해결하기 위해 글로벌 변수를 사용하고 싶지 않았지만 그들 없이는 그것을 해결하는 방법을 모르겠습니다 ... –
전역 변수를 피하는 것이 좋습니다,하지만 신호 처리기와 통신하는 경우 중 하나입니다 ' 필요합니다. – dwc