2014-06-28 77 views
0

我有一個程序,其中的一部分應該顯示每5秒的正常運行時間,但現在它只顯示一次,而不是告訴程序退出。爲什麼這個子進程只進行一次,而不是去程序退出的父進程?C++顯示正常運行時間

  • 下午4:10了171天(S),8:03,13個用戶,平均負載:0.89,1.29,1.46
  • 程序退出現在
  • >時間是16:10:10
  • 定時器0:10
  • 時間是16點10分11秒
  • 定時器0:9
  • 時間是16時10分12秒
  • 定時器0:8
  • 時間是16點10分十三秒
  • 定時器0:7
  • 時間是16時10分14秒
  • 定時器0:6
  • 時間是16點10分15秒
  • 定時器0:5
  • 時間是16點10分16秒
  • 定時器0:4
  • 時間是十六時10分17秒
  • 定時器0:3
  • 定時器0:2
  • 時間是16時10分18秒
  • 定時器0:1
  • 時間是十六點10分19秒

我的代碼是這樣的:

#include "time.h" 

void showClock(){ 
    time_t timeNow; 
    struct tm *locTime; 
    while(Timer>0){ 
     timeNow=time(NULL); 
     locTime=localtime(&timeNow); 
     cout<<"Time is "<<locTime->tm_hour<<":"<<locTime->tm_min<<":"<<locTime->tm_sec<<"\n"; 
     Timer--; 
     sleep(1); 
    } 
    exit(0); 
} 

void showUpTime(){ 
    char buffer[30] = "/usr/bin/uptime"; 
    char* const args[] = {buffer, (char*) 0}; 
    while(Timer>0){ 
     cout<<"Uptime :"<<execv(buffer, args)<<"\n"; 
     Timer-=5; 
     sleep(5); 
    } 
    exit(0); 
} 

void countDown(){ 
    int min;int sec; 
    while(Timer>0){ 
     min=Timer/60; 
     sec=Timer%60; 
     cout<<"Timer "<<min<<":"<<sec<<"\n"; 
     Timer--; 
     sleep(1); 
    } 
    exit(0); 
} 

int main(int argc,char *argv[]){ 
    if(argc<2) 
     Timer=10; 
    else 
     Timer=atoi(argv[1]); 

    pid_t pid; 
    int N=3,i; 
    int status; 
    if(!fork())showClock(); 
    if(!fork())showUpTime(); 
    if(!fork())countDown(); 
    wait(&status);//parent waits; 
    cout<<"Program Exits Now\n"; 
    return 0; 
} 
+0

_'What是錯誤的'_實際上是這裏一個有效的問題過於狹窄。 **注意:**尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現它所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 –

回答

1

問題出在showUpTime()函數中。在該函數中,調用execv(...)來執行正常運行時間。執行execv(...)時,當前進程通過將正常運行時可執行文件加載到先前運行的程序上繼續,並在正常運行時程序執行完畢後退出。等待(&狀態)等待任何子進程退出時,您觀察到主進程已退出,另外兩個子進程仍在執行。

以下是showUpTime()修改後的代碼應該解決這個問題:?

void showUpTime(){ 
    char buffer[30] = "/usr/bin/uptime"; 
    char* const args[] = {buffer, (char*) 0}; 
    while(Timer>0){ 
     pid_t pid = fork(); 
     if (pid == 0) 
      cout<<"Uptime :"<< execv(buffer, args)<<"\n"; 

     Timer-=5; 
     sleep(5); 
    } 
    exit(0); 
} 
+0

+1這就是問題所在,但是「執行execv時,當前進程立即退出」是誤導性的 - 當前進程通過將'uptime'可執行文件加載到先前正在運行的程序(C++代碼問題),那麼當「正常運行時間」代碼終止時,該進程退出。很難清楚簡潔地描述! :d –

0

我沒有看到「定時器」的實際定義在哪裏,這意味着您的剪切粘貼代碼被徹底打破。另外,你的「等待」正在等待一個未初始化的變量(你永遠不會初始化狀態),所以行爲是不確定的。

+0

對於'Timer'是正確的,但是'status'是一個輸出 - 沒有問題。 –

+0

計時器在標題中。對不起,沒有提到 – user3339703