таймер — C ++ Показать время работы

У меня есть программа, часть которой должна показывать время безотказной работы каждые 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  Now\n";
return 0;
}

0

Решение

Проблема в функции showUpTime (). В этой функции execv (…) вызывается для выполнения uptime. Когда execv (…) выполняется, текущий процесс продолжается загрузкой исполняемого файла uptime поверх ранее запущенной программы и завершается после завершения работы программы uptime. Как ждать (&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);
}
1

Другие решения

Я не вижу, где на самом деле определяется «Таймер», что означает, что ваш код «вырезать и вставить» в корне нарушен.

Кроме того, ваше ожидание ожидает неинициализированную переменную (вы никогда не инициализируете Status), поэтому поведение не определено.

0

По вопросам рекламы [email protected]