【问题标题】:Calling cURL command from C++ returns unexpected error codes like 1792 and 6656 [duplicate]从 C++ 调用 cURL 命令会返回意外的错误代码,例如 1792 和 6656 [重复]
【发布时间】:2019-12-02 14:48:11
【问题描述】:

我有一个在嵌入式 Linux 上运行的 C++ 应用程序,它构建并调用 cURL 命令以将文件复制到 FTP 服务器。

std::string cmd = "curl --connect-timeout 10 --ftp-create-dirs "
                  + localPath + filename + " "
                  + ftpPath + filename + " "
                  + userAuth;

int retVal = system(cmd.c_str());

根据构建命令的变量,这会返回意外的错误代码。例如,当我尝试复制一个不存在的文件时,retVal 是 6656 而不是预期的 26(“找不到本地文件”),当我关闭服务器时,retVal 是 1792 而不是预期的 7(“无法连接到服务器”)。

查看这些值,我很确定这与字节顺序有关,但我想了解根本原因。该设备具有 ARMv7 处理器并使用小端格式。

【问题讨论】:

  • 1792 在另一个字节序中似乎是 7,所以可能是这种情况。
  • @Chipster 同样26 = 0x1A, 6656 = 0x1A00
  • @Botje 实际上是这样,我只是没想到!

标签: c++ linux curl endianness


【解决方案1】:

这与字节顺序无关,但记录在 system 手册页中:

在最后两种情况下,返回值是一个“等待状态”,可以 使用 waitpid(2) 中描述的宏进行检查。 (即,WIFEXITED(), WEXITSTATUS() 等)。

WEXITSTATUS:

WEXITSTATUS(wstatus) 返回孩子的退出状态。
这包括 子状态参数的最低有效 8 位 在对 exit(3) 或 _exit(2) 的调用中指定或作为参数指定 用于 main() 中的 return 语句。
应该使用这个宏 仅当 WIFEXITED 返回 true 时。

如果你只是想知道命令是否成功,你应该使用:

if (WIFEXITED(retVal)) {
   int retCode = WIFEXITSTATUS(retVal);
   ...
} else if (WIFSIGNALED(retVal) {
   int signal = WTERMSIG(retVal);
   ...
} else {
   /* process was stopped by a signal */
}

【讨论】:

  • 有意思,谢谢!好像我看错了方向,这实际上不是卷曲问题。所以如果我想检查特定的错误代码,我可以做类似switch (WEXITSTATUS(retVal)) { case 7: ... } ?
  • 是的。假设您首先检查WIFEXITED(retVal)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 2015-08-18
相关资源
最近更新 更多