bash와 같은 명령 인터프리터를 수행하려고하는데 약간의 문제가 있습니다.
ls / cat / grep과 같은 기존 명령을 실행하면 문제없이 작동하지만 qsdjhkoqd와 같은 명령을 실행하려고하면 명령을 찾을 수 없다는 메시지가 표시되고 그 후에 종료하려고하면 종료되지 않습니다.
예를 들어 나쁜 댓글을 4 개하면 프로그램을 종료하려면 5 번의 종료를해야합니다. 나는 그것이 확실히 프로세스 문제라는 것을 알고 있지만 그것을 고치는 방법을 모르겠습니다. 내가 어디에서 잘못되었는지 말해 줄 수 있습니까?
감사 !
int im_your_father(t_struct *tool, char **env, char **argv)
{
int ret;
ret = 0;
if (tool->command.pid == 0)
{
ret = execve(tool->command.command, argv, env);
}
else
wait(NULL);
return (ret);
}
int execute_path(t_struct *tool , char **env ,
char **argv, t_first_elem *list)
{
int i;
int ret;
tool->command.pid = fork();
(void)list;
i = -1;
if (my_strcmp("ls", argv[0]) == 0)
{
while (argv[++i] != NULL)
;
argv[i] = my_strdup("--color=auto");
argv[++i] = NULL;
i = -1;
}
while (tool->path[++i] != NULL)
{
tool->command.command = my_strdup_mod(tool->path[i],
my_strlen(tool->command.line));
my_strcat(tool->command.command, "/");
my_strcat(tool->command.command, argv[0]);
ret = im_your_father(tool, env, argv);
if (ret != -1)
return (0);
}
if (tool->command.pid == 0)
{
my_putstr("son alive");
}
else
{
printf("%d\n", tool->command.pid);
wait(NULL);
}
my_putstr(argv[0]);
my_putstr(": command not found\n");
return (0);
}
문제는 대부분 다음 줄에 있다고 생각합니다.
if (tool->command.pid == 0)
{
ret = execve(tool->command.command, argv, env);
}
우선 .NET Framework에서 반환 값을 캡처 할 필요가 없습니다 execve()
. 성공하면 반환되지 않습니다. 전혀 반환되지 않으면 실패한 것입니다.
둘째, 다음에 무슨 일이 일어날 지 고려해야합니다. 짧은 대답은 이제 두 개의 프로세스가 있으며 둘 다 자신의 셸이라고 생각하는 것입니다. 이제 입력을 읽으려는 두 개의 프로세스가 있으며, 그들은 누가 각 캐릭터를 얻는 지에 대해 다투고, 그 결과는 인간 아이들이 좋아하는 장난감을 사용하는 순서에 대해 다투는 것처럼 엉망입니다.
대부분의 경우, 특히 셸에서 execve()
실패하면 오류 메시지를 생성 한 후 종료 할 수 있습니다.
if (tool->command.pid == 0)
{
execve(tool->command.command, argv, env);
fprintf(stderr, "failed to execute %s (%s)\n", tool->command.command, strerror(errno));
exit(127);
}
정확한 종료 상태는 협상 가능합니다. 나는 보통을 사용 1
하지만 POSIX 표준은 명령 실행에 실패 할 때 종료 상태를 규정합니다 .
명령이 발견되지 않으면 종료 상태는 127이됩니다. 명령 이름이 발견되었지만 실행 가능한 유틸리티가 아닌 경우 종료 상태는 126이됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다