将参数传递给生成的进程在C中不起作用

时间:2012-09-21 20:23:42

标签: c string pointers embedded

我需要将两个地址(32位)传递给由C语言的execl命令生成的进程,如下所示。在第一个程序中:

  char buffer[18];
  sprintf (&buffer[0],"%x\0 %x\0",lock, count);
  arg_list[0]=&(buffer[0]);
  arg_list[1]=&(buffer[10]);
  execl ("/somedirectory/second_process", arg_list[0], arg_list[1], NULL);

然后在我的第二个程序中,我尝试解析地址如下:

  if (argc != 2) {
      printf ("PROCESS 2: Invalid number of arguments. Terminating %i\n", argc);
      return -1;
  }

 if ( !(sscanf (argv[1],"%x",&lock)) || !(sscanf (argv[2],"%x",&count)) ) {
      printf ("PROCESS 2: Problem with parameters passed in");
      return -1;

但是我的程序继续发出错误,说传入的参数无效。当我尝试打印出收到的参数时,我的程序就会挂起。

 printf ("The arguments passsed in are %s %s", argv[1], argv[2]);

FIXED:

我正在错误地进行execl调用。应该是:

  execl ("/somedirectory/second_process", "second_process" arg_list[0], arg_list[1], NULL);

同样在流程2中:

  if (argc != 3) {
      printf ("PROCESS 2: Invalid number of arguments. Terminating %i\n", argc);
      return -1;
  }

因为传入的第一个参数应该是以下Chris建议的进程名称。

谢谢!

2 个答案:

答案 0 :(得分:5)

数组总是基于C,因此你的两个参数将是argv[0]argv[1],而argv[2]将是一个空指针,因此sscanf将失败,崩溃或挂起。

现在通常你应该总是将程序名称作为第一个(argv[0])参数传递。所以你想要:

execl ("/somedirectory/second_process", "second_process", arg_list[0], arg_list[1], NULL);

也就是说,你应该实际传递三个参数(所以argc == 3在第二个程序中。)

答案 1 :(得分:1)

在你的情况下argc将是三个。执行文件的名称始终是第一个参数。