如何将int / char传递给system()一个Linux系统调用

时间:2009-03-31 08:23:37

标签: c linux parameter-passing

好吧,这可能听起来很愚蠢,但我无法找到一种方法将int / char传递给这个系统调用

这是我希望它如何工作

system ("cal %d %d", month, year);

我希望这会在终端“cal 3 2009

上给我以下命令

终端将显示2009年3月的日历。

但是编译器抱怨它有太多的参数

任何想法?我需要让这个方法system ("cal ")给我一个动态日历。

注意:cal接受参数cal month year

7 个答案:

答案 0 :(得分:8)

您需要构建正确的命令行字符串,system()不会为您执行此操作:

char cmd[64];

snprintf(cmd, sizeof cmd, "cal %d %d", month, year);
system(cmd);

关于buffer overflow的常见警告适用,但在这种特殊情况下,当两个参数都是整数时,您应该相当安全。

答案 1 :(得分:3)

基本上,只需从系统调用中执行printf操作:

char my_cmd[MAX_SIZE];
snprintf(my_cmd, MAX_SIZE, "cal %d %d", month, year);
system(my_cmd);

答案 2 :(得分:1)

您需要传递已经完成所有必要转换的字符串。您可以使用sprintf()来生成这样的字符串,只需要小心分配足够大的缓冲区。

答案 3 :(得分:1)

这是因为您假设系统行为类似于printf,而事实并非如此。 要获得所需,首先要通过sprintf获取替换到缓冲区,然后将此缓冲区传递给系统。

但要小心,这可能会成为潜在的安全漏洞,因为您可能会在命令行执行时传递未知参数。此外,您必须要小心,您使用的临时缓冲区足以容纳最终字符串。

答案 4 :(得分:1)

#include <stdlib.h>
#include <stdio.h>

int main()
{
  char command_buf [20];
  const int month = 3;
  const int year = 2009;
  snprintf(command_buf, sizeof(command_buf), "cal %d %d", month, year);
  system(command_buf);
}

答案 5 :(得分:0)

在使用它调用系统之前,必须在字符串中格式化命令,使用snprintf实例

答案 6 :(得分:0)

char
  string[64];

sprintf( string, "cal %d %d", month, year );

system( string );