У меня есть программа, часть которой должна показывать время безотказной работы каждые 5 секунд, но сейчас она просто показывает ее один раз, а не говорит программе выйти. Почему этот дочерний процесс выполняется только один раз, а потом идет к родительскому процессу для выхода из программы?
Мой код такой:
#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;
}
Проблема в функции 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);
}
Я не вижу, где на самом деле определяется «Таймер», что означает, что ваш код «вырезать и вставить» в корне нарушен.
Кроме того, ваше ожидание ожидает неинициализированную переменную (вы никогда не инициализируете Status), поэтому поведение не определено.