gpt4 book ai didi

c++ - 为什么子进程在 unix 中返回退出状态 = 32512?

转载 作者:IT老高 更新时间:2023-10-28 23:11:21 25 4
gpt4 key购买 nike

在我的程序中,我正在执行给定的命令并获取结果(日志和退出状态)。此外,我的程序必须支持特定于 shell 的命令(即包含特定于 shell 的字符 ~(tild)、|(pipe)、* 的命令)。但是当我尝试运行 sh -c ls | wc通过我的程序在我的主目录中失败,其退出状态为 32512,也在 stderr 流中 "sh: ls | wc: command not found"已打印。

但有趣的是命令 sh -c ls | wc如果我在 shell 中运行它,它就可以正常工作。

有什么问题?或者更可取的是如何通过我的程序运行特定于 shell 的命令(即我应该运行哪个命令和哪个参数)?

下面的代码部分在 fork() 之后的子部分中。它执行命令。

tokenized_commandstd::vector<std::string>在我的情况下"sh", "-c", "ls", "|", "wc"已存储,我也尝试存储在那里 "sh", "-c", "\"ls | wc\""但结果是一样的。 commandchar *存储完整命令行的位置。

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

附言

我知道使用 system(command)而是 execvp可以解决我的问题。但是system()等到命令完成,这对我的程序来说还不够好。而且我确信在实现 system()使用了 exec-family 函数之一,因此可以通过 exec 解决问题也是,不过不知道怎么弄。

最佳答案

execvp 获取可执行文件的路径,以及启动该可执行文件的参数。它不需要 bourne shell 命令。

ls | wc 是一个 bourne shell 命令(以及其他命令),由于使用管道,它不能分解为可执行文件的路径和一些参数。这意味着它不能使用 execvp 来执行。

要使用 execvp 执行 bourne shell 命令,必须执行 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 shell 命令相同 sh -c ls '|'厕所.

两者都与shell命令非常不同sh -c ls |厕所。那是

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,但是没有这样的程序。

关于c++ - 为什么子进程在 unix 中返回退出状态 = 32512?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5638321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com