【问题标题】:Why does Microsoft's _wspawnv return EINVAL?为什么微软的 _wspawnv 返回 EINVAL?
【发布时间】:2010-10-29 17:56:48
【问题描述】:

我正在调用 Microsoft 的 _wspawnv 函数,它不断返回 -1 并将 errno 设置为 22; errno.h 将其定义为 EINVAL。根据 Microsoft 的 _wspawnv 文档,仅当 mode 参数无效时才应返回此代码。我尝试在第一个参数中使用 _P_WAIT 和 _P_NOWAIT 调用它,并且都返回相同的错误。


编辑:离开一天可以解决多少问题,真是令人惊讶。我很快就意识到第二个参数中的文件名有引号。拿出来,问题就解决了。

故事的寓意 - 不要相信文档会告诉你一切。我没有花很多时间仔细检查文件名,因为文档没有将其列为可能的嫌疑人,即使错误代码暗示 any 参数可能无效。

【问题讨论】:

  • 从命令行运行这个程序返回的退出代码是什么? (命令完成后,您应该可以使用 echo %ERRORLEVEL%)。

标签: windows visual-c++ spawn


【解决方案1】:

奇怪的是,documentation 还声明:

如果允许继续执行,这些函数将 errno 设置为 EINVAL,并返回 -1。没有产生新的进程。

应该信任多少?

此外,它不应该返回 EINVAL。它将 errno 设置为 EINVAL。

【讨论】:

  • 感谢您注意到这一点。我想我之前看到了它,并忽略了它,因为我知道所有条件都是错误的。我也认为你对代码在 errno 中而不是返回值是正确的,但我现在没有确切的代码 - 我必须稍后再检查。
  • 我认为这个答案是最有帮助的,因为它指出了文档中的明显矛盾。缺乏竞争也没有什么坏处。
  • 这里的解决方案是什么?我面临同样的问题。我在第二个参数中没有引号。
  • @Shashi 问题不是特别是引号,它可能是由任何无效的文件名字符引起的。参见例如stackoverflow.com/questions/1976007/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多