【问题标题】:How does execv does it?execv 是怎么做的?
【发布时间】:2012-08-25 15:17:48
【问题描述】:

也许这是一个魔法问题。我正在尝试创建一个具有以下签名的函数(或等效的 const char *const *args)

void ExecuteJavaVM(char** args){
 
}

我想模拟execv 如何处理参数数组,您可能知道execv 不需要我们放置数组的最大元素数。它只是神奇地计算我们作为第二个参数传递的数组中的元素数量。

这是 execv 签名。

intptr_t _execv( 
   const char *cmdname,
   const char *const *argv 
);

execv 以某种方式设法“计算”数组 argv 中的元素数量。这正是我想要做的。

sizeof 几乎没用,因为数组的数据类型衰减为一个简单的指针,所以sizeof 很可能总是返回 4。

有什么想法吗?有谁知道在哪里可以找到这些 Windows 功能的来源?

【问题讨论】:

  • “它只是神奇地计算了我们作为第二个参数传递的数组中的元素数量。”这是错误的。您阅读手册页了吗?
  • +1。 R. Martinho Fernandes 是正确的,我赞成他/她的回答,但从您引用的签名来看,您从the woefully incomplete MSDN documentation 获取了您的信息。我认为这不值得投反对票。
  • @R.MartinhoFernandes 公平地说,execv 函数的 MSDN 文档没有提到它是一个以 NULL 结尾的数组。
  • @john 是的,我花了一段时间才意识到这是针对 Windows POSIX 仿真的东西。我以为是为了 Cygwin 什么的。 (为此,我将我的答案从引用 Linux 手册页更改为引用 POSIX 文档)。
  • @avd:Windows 可能不是使用 POSIX 的最佳平台

标签: c windows exec


【解决方案1】:

来自POSIX docs(强调我的):

参数argv 是一个指向以空字符结尾的字符串的字符指针数组。 应用程序应确保此数组的最后一个成员是空指针。 这些字符串应构成可用于新进程映像的参数列表。 argv[0] 中的值应该指向一个文件名,该文件名与正在由其中一个 exec 函数启动的进程相关联。

【讨论】:

  • 感谢您的提示。 msdn 中的文档没有谈到这个要求。但这一切都是有道理的,这解释了在其可变参数对应项中强制 NULL 参数。
猜你喜欢
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 2010-09-11
  • 2011-07-05
  • 2013-06-19
相关资源
最近更新 更多