2015-09-27 94 views
0

我的代碼如下:打開一個xterm的終端,運行./paramax可執行如何獲取xterm中的命令行參數?

#include <unistd.h> 
#include <sys/ipc.h> 

int main(int argc, char* argv[]) 
{ 
execl("/usr/bin/xterm", "/usr/bin/xterm", "-hold", "./paramax", (void*)NULL); 
return 0; 
} 

現在的問題是./paramax我需要給它以執行一個命令行參數。如何繼續?

+0

請注意,'execl()'的最後一個參數應該是'(char *)NULL',而不是'(void *)NULL',因爲參數都是'char *'。然而,一個程序對於這種錯誤投票是不可能的。 –

回答

1

運行xterm -e ./paramax arg and more args,直接或通過執行調用。

0

我想你需要停止使用execl()並開始使用execv()代替:

#include <errno.h> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 

int main(int argc, char* argv[]) 
{ 
    char *base_args[] = { "/usr/bin/xterm", "-hold", "./paramax", }; 
    enum { NUM_BASEARGS = sizeof(base_args)/sizeof(base_args[0]) }; 
    char *args[NUM_BASEARGS + argc]; 
    int i; 
    for (i = 0; i < NUM_BASEARGS; i++) 
     args[i] = base_args[i]; 
    for (int j = 1; j < argc; j++) 
     args[i++] = argv[j]; 
    args[i] = 0; 
    execv(args[0], args); 
    fprintf(stderr, "%s: failed to execute %s (%d: %s)\n", 
      argv[0], args[0], errno, strerror(errno)); 
    return 1; 
} 

這種分配的基本參數(基本xterm命令和參數的args VLA(變長數組)的足夠的指點),加上這個程序的每個命令行參數(程序名除外),加上最後一個null。然後它將各種參數列表複製到args中,然後運行該程序,如果它未能執行命令並以失敗(非成功)狀態退出則報告錯誤。從execv()測試返回值沒有意義;如果它返回,則失敗,如果成功,則不會返回。

請注意,我假設你的基本execl()命令成功執行xterm,而且xterm成功運行./paramax程序,沒有額外的參數。如果這不起作用,則需要使用base_args選項列表,直到它正常工作。但是,當我在包含echo Hello World的shell腳本paramax的Linux(Ubuntu 14.04)上對其進行測試時,我得到了一個xterm,其中顯示了Hello World。控制沒有返回到我運行它的命令行,直到xterm(取代原來的程序)退出。你可以在execv()代碼之前用fork()來解決這個問題,只要你在孩子中做execv()並退出父代。