2010-08-10 94 views
1

我是使用C中的系統調用進行編程的初學者。我試圖在我的某個程序中使用execve調用。我必須將一個整數作爲參數傳遞給正在通過execve調用的程序。 但是,在互聯網上閱讀並看到示例代碼,我可以看到我們只能傳遞字符串作爲參數。所以,我嘗試使用'sprintf'將整數轉換爲字符串,然後使用'strcpy'將該字符串複製到必須通過execve傳遞的字符串數組中的一個元素中。 但是使用strcpy會導致分段錯誤。我通過調試檢查了這一點,如果我不使用strcpy,只是寫一些像 - myargv [1] =「123」; 然後整個程序工作正常。 但是因爲我必須傳遞一個變量整數作爲參數而不是常量,所以我不能使用上面的方法。使用execve時傳遞整數參數

這個問題一直困擾我一段時間。請幫我解決我應該做什麼。

+1

向我們展示一些代碼。我的猜測是你沒有爲目標字符串分配任何內存。 – 2010-08-10 05:23:34

回答

4

這幾乎肯定是因爲你沒有爲你的字符串分配空間。

原因myargv[1]="123";的工作原理是因爲您將指針設置爲指向已存在的字符串(編譯器通常將該「123」放入預先初始化的內存中並且它只是被加載)。通過使用類似:

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

你通常遇到的問題,因爲沒有分配的後備存儲爲myargv[1]指針。


你可以做的是簡單地設置myargv[1]直接到緩衝區,你sprintf -ed字符串:

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

我不清楚爲什麼你正在使用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可能是賽格斷層,因爲你沒有分配給目的地的緩衝區,但上面的例子表明,這是無論如何不必要的操作。