2015-04-04 83 views
0

我嘗試用c程序執行一些帶有參數的程序。但它似乎不起作用。 下面是在C代碼:c執行不起作用

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

int main(int argc, char *argv[]) 
{ 
    int i; 
     for (i = 0; i < 10; i++) 
     { 
       execl("tempo2","-gr fake","-f best.sim.par","-ndobs 30","-nobsd 1","-ha 12","-randha y","-start 57023","-end 60000","-rms 0.0012",NULL); 
     } 
    return 0; 
} 

我與薄荷17 GCC編譯當我運行的C-程序沒有任何反應。 在bash它的工作原理,看起來像這樣:

#!/bin/bash 

for i in `seq 1 10`; 
do 
    tempo2 -gr fake -f best.sim.par -ndobs 30 -nobsd 1 -ha 12 -randha y -start 57023 -end 60000 -rms 0.0012 
done 

誰能翻譯我bash的代碼轉換爲C或告訴我做錯了什麼? 感謝,並愉快hollydays

+0

任何不使用bash腳本的理由? – 2015-04-04 20:22:36

回答

2

你可以使用system()函數,而不是execl的()執行shell命令

system("tempo2 -gr fake -f best.sim.par -ndobs 30 -nobsd 1 -ha 12 -randha y -start 57023 -end 60000 -rms 0.0012"); 
+0

沒關係,那很有用。我需要在一個循環中運行程序tempo2 10,000次。這大約需要6個小時。我可以通過bash或c運行它,不管花費多少。問:有沒有一種方法可以加速這個過程? – feeling 2015-04-04 20:33:53

+0

你可以和使用線程和運行此命令與異步其他線程中的循環,我不認爲這會提高性能,但你可能會得到更好的速度結果。 – 2015-04-04 20:44:00

1

檢查返回代碼。根據手冊頁,

返回值是-1,並且errno被設置爲指示錯誤。

我沒有你的程序,但你需要指定「tempo2」的完整路徑,否則你會得到errno 2 =>沒有這樣的文件或目錄。

1

execl的第一個參數是程序運行的路徑。第二個參數是出現在該程序的argv[0]中的值,通常是相同的。因此,您應該在您的參數列表中輸入"tempo2"兩次。另外,命令行上的每個空格分隔的單詞都應該放在單獨的字符串中。因此,而不是"-gr fake",您應該使用"-gr","fake"

總而言之,你的電話execl應該是這樣的:

execl("tempo2","tempo2","-gr","fake","-f","best.sim.par","-ndobs","30","-nobsd","1","-ha","12","-randha","y","-start","57023","-end","60000","-rms","0.0012",NULL); 

最後,一個重要的事情有關execl。它用替換當前進程與新程序。因此,即使它處於循環中,tempo2將只運行一次。要做你想做的事,你需要使用fork創建一個子進程來運行每個execl

總而言之,你可能最好使用system @SunDro建議。

+0

好吧,非常感謝這個解釋 – feeling 2015-04-06 08:37:43