execvp
принимает путь к исполняемому файлу и аргументы для запуска этого исполняемого файла.Он не принимает команды оболочки Bourne.
ls | wc
- это команда оболочки Bourne (среди прочих), и ее нельзя разбить на путь к исполняемому файлу и некоторым аргументам из-за использованиятруба.Это означает, что он не может быть выполнен с использованием execvp
.
Чтобы выполнить команду оболочки Bourne с использованием execvp
, нужно выполнить sh
и передать -c
и команду для аргументов.
Итак, вы хотите выполнить ls | wc
, используя execvp
.
char *const argv[] = {
"sh",
"-c", "ls | wc", // Command to execute.
NULL
};
execvp(argv[0], argv)
Вы, очевидно, пытались
char *const argv[] = {
"sh",
"-c", "ls", // Command to execute.
"|", // Stored in called sh's $0.
"wc", // Stored in called sh's $1.
NULL
};
Это было бы так же, как команда оболочки Bourne sh -c ls '|' wc
.
И оба они сильно отличаются от команды оболочки sh -c ls | wc
.Это было бы
char *const argv[] = {
"sh",
"-c", "sh -c ls | wc", // Command to execute.
NULL
};
Вы, кажется, думаете, что |
и wc
передаются в sh
, но это совсем не так.|
- это специальный символ, который приводит к каналу, а не к аргументу.
Что касается кода выхода,
Bits 15-8 = Exit code.
Bit 7 = 1 if a core dump was produced.
Bits 6-0 = Signal number that killed the process.
32512 = 0x7F00
Таким образом, он не умер от сигнала, дамп ядра не был создан, и он завершился с кодом 127 (0x7F).
Что означает значение 127, неясно, поэтому оно должно сопровождаться сообщением об ошибке,Вы пытались выполнить программу ls | wc
, но такой программы нет.