【问题标题】:passing integer arguments when using execve使用 execve 时传递整数参数
【发布时间】:2010-08-10 05:21:25
【问题描述】:

我是在 C 中使用系统调用进行编程的初学者。我正在尝试在我的一个程序中使用 execve 调用。我必须将一个整数作为参数传递给通过 execve 调用的程序。 但是,在互联网上阅读并查看示例代码,我可以看到我们只能将字符串作为参数传递。因此,我尝试使用“sprintf”将整数转换为字符串,然后使用“strcpy”将该字符串复制到必须通过 execve 传递的字符串数组的元素之一。 但是使用 strcpy 会导致分段错误。我通过调试检查了这一点,如果我不使用 strcpy 而只是写一些类似的东西 - myargv[1]="123"; 然后整个程序工作正常。 但是由于我必须传递一个变量整数作为参数而不是常量,所以我不能使用上述方法。

这个问题困扰了我一段时间。请帮我看看我应该怎么做。

【问题讨论】:

  • 给我们看一些代码。我的猜测是您没有为目标字符串分配任何内存。

标签: c integer arguments exec


【解决方案1】:

几乎可以肯定是因为你没有为你的字符串分配空间。

myargv[1]="123"; 起作用的原因是因为您将指针设置为指向一个已经存在的字符串(编译器通常将“123”放入预初始化的内存中并且它只是被加载)。通过使用类似的东西:

char *myargv[10];
strcpy (myargv[1], "anything");

您通常会遇到问题,因为没有为 myargv[1] 指针分配后备存储。


您可以做的是简单地将myargv[1] 直接设置到您sprintf 编辑字符串的缓冲区:

char sprintf_buffer[whatever];
sprintf (sprintf_buffer, "%d", myInteger);
myargv[1] = sprintf_buffer;

或者,如果您要重新使用该缓冲区(这样多个整数参数的值会被覆盖),请使用 strdup

char sprintf_buffer[whatever];
sprintf (sprintf_buffer, "%d", myInteger1);
myargv[1] = strdup (sprintf_buffer);
sprintf (sprintf_buffer, "%d", myInteger2);
myargv[2] = strdup (sprintf_buffer);

如果出于某种原因,您的平台没有strdup,这里有一个适合您:

char *strdup (const char *s) {
    char *d = (char *)(malloc (strlen (s) + 1));
    if (d != NULL)
        strcpy (d,s);
    return d;
}

请记住,您应该始终检查来自strdup 的返回值,以确保内存分配有效。我把它留在这里,因为它与手头的问题无关。


您可以避免使用多个缓冲区分配内存(前提是您事先知道需要的缓冲区的绝对数量):

char sprintf_buffer1[whatever];
char sprintf_buffer2[whatever];
sprintf (sprintf_buffer1, "%d", myInteger1);
myargv[1] = sprintf_buffer1;
sprintf (sprintf_buffer2, "%d", myInteger2);
myargv[2] = sprintf_buffer2;

【讨论】:

    【解决方案2】:

    我不清楚你为什么使用strcpy。只需将 snprintf 数字转换为字符串并将其作为参数之一。

    例如

    char numberArgBuffer[20];    // more than big enough for a 32 bit integer
    snprintf(numberArgBuffer, 20, "%d", numberArg);
    char* argv[3];
    char* envp[1];
    argv[0] = exeName;           // could be same as path
    argv[1] = numberArgBuffer;
    argv[2] = NULL;
    envp[0] = NULL;
    int ret = execve(path, argv, envp);
    // if you get here execve failed, so handle the error
    

    您的strcpy 可能是段错误,因为您没有为目标分配缓冲区,但正如上面的示例所示,无论如何这都是不必要的步骤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多