显示正常运行时间

C++ Show uptime

本文关键字:运行时间 显示      更新时间:2023-10-16

我有一个程序,其中一部分应该每5秒显示一次正常运行时间,但现在它只是显示一次,而不是告诉程序退出。为什么子进程只运行一次,而在程序退出时返回父进程?

  • 下午4:10上升171天,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:13
  • 计时器0:7
  • 时间为16:10:14
  • 计时器0:6
  • 时间为16:10:15
  • 计时器0:5
  • 时间为16:10:16
  • 计时器0:4
  • 时间为16:10:17
  • 计时器0:3
  • 计时器0:2
  • 时间为16:10:18
  • 计时器0:1
  • 时间为16: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  Nown";
    return 0;
}

showUpTime()函数有问题。在该函数中,调用execv(…)来执行uptime。当执行execv(…)时,当前进程通过在先前运行的程序上加载正常运行时可执行文件来继续,并在正常运行时程序完成执行后退出。当wait(&status)等待任何子进程退出时,您观察到主进程退出,而另外两个子进程仍在执行。

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);
}

我不知道"Timer"在哪里被定义,这意味着你的剪切-粘贴代码从根本上被破坏了。

同时,你的"wait"正在等待一个未初始化的变量(你从来没有初始化过Status),所以行为是未定义的。