2015-11-11 78 views
0

程序: 我的程序的目標是利用另一個程序來執行它的計算。問題是與該程序異步通信。以下是我用來調用其他程序的一段代碼。這是通過分佈式計算腳本完成的。C和Unix環境之間的異步通信

while(c < Images) 
{ 
    system(CommandArray[c]); 
    k = chdir(ImageArray[c]); 
    if(k != 0) 
    { 
     printf("Directory Change Failed!"); 
    } 
    else 
    { 
     system("qsub SubScript.sh"); 
     printf("Job Submitted for Image: %d \n",c+1); 
     sleep(1); 
    } 
    c++; 
    k = chdir("../"); 
} 
c = 0; 
printf("Starting 'Checking' Script"); 
system("./CheckingScript.sh 3"); 

含義變量:

  • ImageArray並[c]:包含子目錄(IMAGE_1,IMAGE_2等)的名稱
  • SubScript.sh:這是用於將由該程序的其餘部分(代碼未示出)生成的文件提交給服務器的頭節點並將這些作業發送給其他節點上的另一程序執行的腳本。
  • CheckingScript.sh:一個簡單的腳本,用於檢查由SubScript生成的「狀態」文件是否存在。如果文件存在,腳本將在該目錄中等待,直到該文件不再存在。然後移動到下一個目錄。這是爲了告訴其他程序是否完成了這項工作。

問題:不管我做什麼,我不能讓C程序中等待結果回來,而不會導致那些在其他程序工作突然被清空目錄(該文件全部仍然存在,但他們的內容被刪除)。我試圖直接從C程序檢查目錄,但這會導致上述問題。所以作爲最後的手段,我試圖寫一個腳本來爲我做檢查。它的工作原理! (不是真的......)我可以使用命令行中的腳本,它可以按照預期工作,但是當我通過system()提交它時,它不會回顯任何內置語句以顯示它正在運行。這意味着system()會執行,然後程序結束而不收集其他應該等待的程序的結果。

感謝您閱讀本文,我非常感謝幫助!我知道系統()命令是有點暴躁,所以任何有關替代選項的建議將不勝感激。有關我的程序的更多信息,請參閱我的博客:Link to Blog

+3

閱讀關於'fork','execv'和'pipe' – fghj

+0

你可以用系統啓動一個應用程序,或者你可以打開一個管道,或者你可以打開一個套接字,它們都有不同的語義......但是你應該能夠完成你想要的任何他們... –

+0

我會閱讀這些不同的主題(承諾),但我想如果我必須非常具體我的問題將是爲什麼我不能得到系統( )等待腳本完成執行? – Jet

回答

0

嗯,我猜popen()函數可以幫助您收集結果。 函數popen()執行命令並在調用程序和執行的命令之間連接管道。我建議您參考該功能的手冊頁瞭解詳細信息。

嘗試下面的代碼並使用fgets()函數從管道中讀取。

FILE *fp = popen("./CheckingScript.sh 3", "r"); 

不要忘記通過使用pclose()而不是fclose()來關閉fp。