LINUX.ORG.RU

Какая-то мистика с execv


0

0

У меня есть простой код:

    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;
        }

        if(WIFEXITED(*status)) {
            exitValue = WEXITSTATUS(*status);
        } else {
            if(WIFSIGNALED(*status))
                printf ("exec failed: program terminated by signal %d\n", WTERMSIG(*status));
            else if (WIFSTOPPED(*status))
                printf ("exec failed: program stopped by signal %d\n", WSTOPSIG(*status));

            exitValue = -1;
        }
    } else {
        char *shell[] = {"/bin/sh", "-c", cmdline, NULL};
       
        environ = envp;
       
        execvp(shell[0], shell);

        exitValue = errno;
        showSystemErrorMessage (exitValue);
        _exit(exitValue);
    }

Все вроде бы нормально начинает работать, но периодически простые
программы типа unzip отваливаются с сообщением exec failed: program
terminated by signal 115.
Просто не знаю, на что подумать. Что за сигнал 155? Почему unzip
падает?
Кто-нибудь может сказать, в чем дело?
Спасибо.
anonymous

> } else if (newprocess) {
> // child

parent, вообще-то...

> Что за сигнал 155?

такого сигнала нет.

что возвращает waitpid()?
если ноль (хотя и не должна без WNOHANG),
то в *status мусор.

где как обьявлена переменная status?
может туда еще кто-то пишет, попробовать поменять
на локальный int status.

можно посмотреть на код после cc -E.
strace -f опять же.

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.