정말 기본적인 쉘을 썼습니다. fork() 및 waitpid()를 사용하면 부모 프로세스가 자식을 기다리지 않습니다.waitpid()가 자식을 기다리지 않습니다.
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/syscall.h>
#include <linux/limits.h>
#include "LineParser.h"
#include <termios.h>
#define MAX_STR 2048
void execute(cmdLine *pCmdLine);
int main()
{
char isContinuing = 1;
char path[PATH_MAX];
char str[MAX_STR];
char something[MAX_STR+PATH_MAX];
cmdLine* cmd;
while(isContinuing)
{
getcwd(path, PATH_MAX);
printf("%s$ ", path);
fgets(str, MAX_STR, stdin);
if(!strncmp(str, "quit", strlen("quit")))
{
isContinuing = 0;
}
else
{
cmd = parseCmdLines(str);
if(cmd->arguments != '\0')
{
execute(cmd);
}
}
}
freeCmdLines(cmd);
return 0;
}
void execute(cmdLine *pCmdLine)
{
pid_t id = fork();
if(id == 0)
{
printf("I AM CHILD.\n");
if(!execvp(pCmdLine->arguments[0], pCmdLine->arguments))
{
perror("execvp failed.\n");
exit(1);
}
exit(0);
}
printf("I AM PARENT.\n");
printf("WAITING FOR CHILD.\n");
waitpid(id);
printf("DONE WAITING\n");
}
LineParser 헤더 파일은 완전한 것이며 정상적으로 작동합니다. 지금, 어떤 이유로, 첫 번째 명령은 예상대로 작동하고, 는 이제 입력을 가정 해 봅시다 "에코 안녕", 출력은 예상대로
I AM PARENT.
WAITING FOR CHILD.
I AM CHILD.
DONE WAITING.
다음이 "안녕하세요"하고 경로를 인쇄, 명령을 다시 기다리는 중입니다. 내가 두 번째로 같은 입력 "에코 안녕하세요"를 입력 할 때 어떤 이유 , 출력은 다음과 같습니다
I AM PARENT.
WAITING FOR CHILD.
DONE WAITING.
$PATH$ //(WITHOUT WAITING FOR INPUT !!!)
I AM CHILD.
hi
//and here waiting for input//
왜 이런 일이 발생합니까?
대단히 감사합니다! 사실 문제는 'waitpid()'에 있었고 while 루프 밖에서 무료로 사용한다는 것을 알지 못했습니다. 오케이. 그건 그렇고, 나는 무언가를 사용하지만, 완전한 코드에서는, 부적절하므로 여기서 제거하는 것을 잊었다. 다시 한번 감사드립니다. – Joseph
'execvp', 대부분의 다른 함수는 실패시'-1'을 반환합니다. '0'을 반환하지 않습니다. 따라서'execvp failed '코드는 절대로 실행될 수 없습니다. –