Есть вот такой код:
pid_t newprocess = fork();
if (newprocess < 0){
perror ("fork");
exitValue = -1;
} else if (newprocess) {
// child
if(waitpid(newprocess,&status,0) < 0) {
perror ("waitpid");
exitValue = -1;
} else if(WIFEXITED(status)) {
exitValue = WEXITSTATUS(status);
} else if(WIFSIGNALED(status)) {
exitValue = 0;
} else {
if (WIFSTOPPED(status))
printf ("exec failed: program stopped by signal %d\n", WSTOPSIG(status));
else
printf ("exec failed: ???\n");
exitValue = -1;
}
} else {
char *shell[] = {"/bin/sh", "-c", cmdline, NULL};
environ = envp;
execvp(shell[0], shell);
exitValue = errno;
showSystemErrorMessage (exitValue);
_exit(exitValue);
}
Код этот вызывается из Java-вского native метода.
Почти всегда все работает хорошо, но иногда waitpid падает с ошибкой
ECHILD, однако программа (это происходит всегда при вызове /bin/cp)
отрабатывает нормально, т.е. файлы оказываются успешно скопироваными.
В чем тут может быть дело? Что-то я не соображу. Единственное, что
приходит в голову, глядя в man waitpid - может быть, игнорируется
SIGCHLD. А что еще может привести к такому поведению?
Спасибо.
Ответ на:
комментарий
от idle
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Какая-то мистика с execv (2004)
- Форум Почему зомби самоуничтожается? (2011)
- Форум Реализация конвейра (2019)
- Форум execl не принимает аргумент из pipe (версия 2, обновленная) (2015)
- Форум как присвоить ребенку новую группу процесса? (2020)
- Форум Передача имени файла дочернему процессу (2017)
- Форум помогите найти ошибки в следующем перловом коде (2004)
- Форум Разработка своего shell'a (2012)
- Форум fork && waitpid (2005)
- Форум fork && waitpid && dlopen (2005)