0

我有一个程序,其中一部分应该每 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;
}
4

2 回答 2

1

问题出在 showUpTime() 函数中。在该函数中,调用 execv(...) 以执行正常运行时间。当 execv(...) 被执行时,当前进程继续通过加载 uptime 可执行文件覆盖先前运行的程序,并在 uptime 程序完成执行后退出。当 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);
}
于 2014-06-29T03:50:30.093 回答
0

我看不到“计时器”的实际定义位置,这意味着您的剪切粘贴代码从根本上被破坏了。

此外,您的“等待”正在等待未初始化的变量(您从未初始化状态),因此行为未定义。

于 2014-06-29T00:56:09.660 回答