2015-12-02 52 views
1

所以,我有一個問題,我一直沒能解決。我正在寫一個C程序,通過管道執行一些OS功能。執行通過execvp(const char * file,char * const argv []);來完成。從ARGV到execvp

以我主要功能我想借此傳遞給除第一個字符陣列的程序(的argv)整行,並將其傳遞到grep。一切正常的時刻,但我不斷收到警告:

我的代碼看起來像下面。在第if(1 < argc)我希望能夠與修改,以newPipeline上相同的格式printenv,種類少的第一個帖子發送argv

int main(int argc, char** argv, char **envp){ 

    const char* printenv[] = {"printenv", NULL, NULL}; 
    const char* sort[] = {"sort", NULL, NULL}; 
    const char* less[] = {"less", NULL, NULL}; 
    if(1<argc){ 
     argv[0] = "grep"; 
     const char* grep = argv; 
     const char* const* commands[] = {printenv, sort, grep, less, NULL}; 
     newPipeline((char* const**)commands, 0, STDIN_FILENO); 
    } 
    //FROM HERE ON IT WORKS 
    else{ 
     const char* const* commands[] = {printenv, sort, less, NULL}; 
     newPipeline((char* const**)commands, 0, STDIN_FILENO); 
    } 
    if(signal(SIGCHLD, SIG_IGN) == SIG_ERR){ 
     perror("A problem with the children"); 
    } 
    exit(0); 
} 

我知道指針類型是錯誤的。我應該爲grep構建一個全新的陣列,還是應該像我現在要做的那樣,將指針轉換爲正確類型的指針。如果以後,哪個指針會是?

+1

您應該將您的數組(argv)複製到另一個數組中以與 –

+1

一起使用'argv'不是'const'。您可以隨意修改它(也可以使用'grep'),因此每次將其傳遞時都要複製一份。 –

+0

你想要將argv的元素加入由空格分隔的單個字符串中,對嗎?那就是你在這種情況下丟失的東西 – someguy

回答

2

你的grep變量需要是指向一個字符串數組或一個字符串數組(不是簡單的字符串)。

喜歡的東西:

argv[0] = "grep"; 
const char** grep = (const char**)argv; //make grep point to the modified char** argv; 

應該這樣做,或構建一個新的數組:

const char* grep[argc+1]; 
grep[0] = "grep"; 
grep[argc]=NULL; 
for(int i=1; i<argc; i++){ 
    grep[i] = argv[i]; 
} 

順便說一句,我相信你只需要一個NULL在每個字符串數組的結尾。

1

問題就出在這裏

const char* grep = argv; 

C不爲const的類型提供內部類型轉換。如果你的動機是的argv陣列複製到grep,這是錯的,使用strcpy或任何這樣的功能,使該數組的一個副本。