Почему дочерний процесс возвращает статус выхода = 32512 в unix?

В моей программе я выполняю данную команду и получаю результат (журнал и статус выхода). Также моя программа должна поддерживают специфичные для оболочки команды (т.е. команды, содержащие специфические для оболочки символы ~ (tild), | (pipe), *). Но когда я пытаюсь запустить sh -c ls | wc в моем домашнем каталоге через мою программу он не удался, и его статус выхода был 32512, также в потоке stderr было напечатано «sh: ls | wc: command not found» .

Но интересно то, что команда sh -c ls | wc работает правильно, если я запускаю его в оболочке.

В чем проблема? Или, что более предпочтительно, как я могу запускать специальные команды оболочки через мою программу (т.е. ec, какую команду с какими параметрами мне следует запускать)?

Приведенная ниже часть кода находится в дочерней части после fork (). Он выполняет команду.

tokenized_command is std :: vector , где в моем случае "sh", "-c", "ls", " | "," wc ", также я пытался сохранить там " sh "," -c "," \ "ls | wc \ "" , но результат такой же. команда - это char * , где хранится полная командная строка.

        boost::shared_array<const char *> bargv(new const char *[tokenized_command.size() + 1]);
        const char **argv = bargv.get();
        for(int i = 0; i < tokenized_command.size(); ++i)
        {
            argv[i] = tokenized_command[i].c_str();
            printf("argv[%d]: %s\n", i, argv[i]); //trace
        }
        argv[tokenized_command.size()] = NULL;

        if(execvp(argv[0], (char * const *)argv) == -1)
        {
            fprintf(stderr, "Failed to execute command %s: %s", command, strerror(errno));
            _exit(EXIT_FAILURE);
        }

PS

Я знаю, что при использовании system (command) вместо execvp может решить мою проблему. Но system () ждет, пока команда не будет завершена, а для моей программы этого недостаточно. А также я Я уверен, что в реализации system () используется одна из функций семейства exec, поэтому проблему можно решить и с помощью exec , но я не знаю как.

13
задан Mihran Hovsepyan 13 April 2011 в 13:31
поделиться