【问题标题】:execl not capturing all argumentsexecl 没有捕获所有参数
【发布时间】:2015-01-25 05:44:54
【问题描述】:

execl 语句可能有什么问题?当我尝试运行它时,接收可执行文件抱怨argc 小于 3。当我打印 argv 内容时,我得到以下信息:

argv[1] = -1076146944
argv[2] = 0 

尽管参数包括:

numJoeysStr = 6
randomNumSeedStr = 7

execl("/path/to/executable", "numJoeysStr", "randNumSeedStr", (char *)0);

FWIW,我尝试用 NULL 代替 (char *)0)。这并没有什么不同。

Chris Jester-Young 解决了我最大的问题,但现在我在两次放入函数后得到以下结果:

argv[1] = -1075725068
argv[2] = -1075725056 

我尝试取消引用,方法是:

printf("argv[1] = %d\n", *argv[1]);
printf("argv[2] = %d\n", *argv[2]);

只接收以下内容:

argv[1] = 110
argv[2] = 114

如我所料:

argv[1] = 6
argv[2] = 7

对于最后一个问题,事实证明,将变量传递给 execl 而不带引号给了它我预期的数字。不知何故,我的印象是所有execl 参数(除了最后一个)都必须用引号引起来,即使是变量也是如此。

【问题讨论】:

  • 为什么将参数打印为整数而不是字符串?
  • 哦,对了!让我试试 strtol()
  • 我在您编辑之前发表了评论。您的新问题是您正在打印第一个字符的 ASCII 值,这不是您想要的。 (是的,strtol 会将数字的十进制形式(在字符串中)转换为实际数字)
  • @immibis - 查看最终编辑
  • @user1185790 对于字符串,您应该使用%s,而不是%d。

标签: c exec


【解决方案1】:

您实际上需要指定"/path/to/executable" 两次。第一个是要执行的程序,第二个是新进程的argv[0]。

【讨论】:

  • 太好了,谢谢!我现在有 argv[1] = -1076376332 和 argv[2] = -1076376320。我假设这些参数是必须取消引用的指针。
  • 好答案。实际上,您不需要输入两次程序名称,但您必须输入一些将作为 argv[0] 传递给程序的内容。您可以更改 argv[0],甚至可以对正在执行的程序撒谎。约定要求放置程序名称,但这只是约定。
  • @LuisColorado 是的,你可以将任何你想要的东西传递给argv[0](在某些操作系统上它甚至可以为空,这意味着新进程将具有argc == 0),但按照惯例,您应该默认传递程序名称,因为这就是 shell 所做的。
  • @ChrisJester-Young,在 linux 中,这是一种让 .so 库显示它需要哪些模块的方法(不传递任何参数)(它被 ldd(1) 使用 程序)
猜你喜欢
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2011-09-27
  • 2014-09-05
  • 1970-01-01
相关资源
最近更新 更多