2012-09-21 72 views
1

中不起作用我需要將兩個地址(32位)傳遞給來自C的execl命令產生的進程,如下所示。在第一種方案:將參數傳遞給派生進程在C

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; 
    } 

正如應該是這個過程的名稱如下克里斯建議通過的第一個參數。

謝謝!

+0

「excel命令產生的進程」 - Excel?那麼這個Visual Basic? (只是在開玩笑。) – 2012-09-21 20:27:38

+0

sorrry。固定:) – Falcata

+0

沒有問題的隊友;) – 2012-09-21 20:30:43

回答

5

數組始終立足C 0,所以你的兩個參數會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

在你的情況下,argc將是三。正在執行的文件的名稱始終是第一個參數。

+0

將其設置爲2會產生錯誤: 過程2:參數的數量無效。終止2 – Falcata

+1

@Falcata這就是爲什麼shf301說你需要檢查3 :) – mah

+0

這是錯誤的。 Exec調用可以指定argv [0] – singpolyma