C-程序将在30秒后终止

问题描述:

我们被要求提示用户输入短语,并继续询问他们,直到他们得到正确的短语所需的时间为30秒。这是我想出的:C-程序将在30秒后终止

#include <sys/types.h> 
#include <unistd.h> 
#include <signal.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

void childprocess(void) 
{ 
    int start = 30; 
    do 
    { 
     start--; 
     sleep(1); 
    } while (start >= 0); 
    printf("Time ran out!\n"); 
    exit(EXIT_SUCCESS); 
} 

int main(void) 
{ 
    pid_tiChildID;/* Holds PID of current child */ 
    char word[100] = "cat"; 
    char input[100]; 
    int length; 
    iChildID = fork(); 
    if (0 > iChildID) 
    { 
     perror(NULL); 
     return 1; 
    } 
    else if (0 == iChildID) 
    { 
     childprocess(); 
     return 0; 
    } 
    /* Parent process */ 
    while (1) 
    { 
     fgets(input, sizeof(input), stdin); 
     length = strlen(input); 
     if (input[length - 1] == '\n') 
     { 
      --length; 
      input[length] = '\0'; 
     } 
     if (strcmp(word, input) == 0) 
      break; 
     printf("Try again\n"); 
    } 
    kill(iChildID, SIGUSR1);/* terminate repeating message */ 
    printf("Finally!\n"); 
    return 0; 
} 

问题:30秒后,它打印“时间用完”,但不会终止。 30秒后如何终止程序?任何帮助?

+1

为什么你期望它在'while(1)'卡住时终止? – John3136

+0

那不是30秒。那将是30次迭代。要从开始时间减去当前时间30秒,并寻找30 –

+0

如果你打算这样做,使用'sleep(30);'睡30秒,而不是一个循环。当孩子醒来时,孩子应该向父母发出一个信号,并且如果成功,只报告该时间过期。家长需要处理信号并在收到信号时退出。当给出正确的输入时,它可以决定忽略该信号,以免它过早终止。或者,您可以简单地让代码在一个进程中处理SIGALRM并使用'alarm()'系统调用来设置超时。或者使用其中一种更现代的变体,但是'alarm()'对你来说很好。 –

在这里,您正在使用fork创建两个不同PID的独立进程。你正在杀死孩子的过程,但父母仍然在运行,所以程序只是不放弃。

你也可以使用pthread而不是fork来保留在同一个单独的进程中,但是你试图实现的东西很简单,具有报警功能。您不必管理任何其他进程。只需使用警报。

#include <unistd.h> 
#include <signal.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

static void ALARMhandler(int sig) 
{ 
    printf("Time ran out!\n"); 
    exit(EXIT_SUCCESS); 
} 

int main(void) 
{ 
    char word[100] = "cat"; 
    char input[100]; 
    size_t length; 

    signal(SIGALRM, ALARMhandler); 
    alarm(30); 

    while(1) { 
     fgets(input, sizeof(input),stdin); 
     length = strlen(input); 
     if(input[length-1] == '\n') { 
      --length; 
      input[length] = '\0'; 
     }   
     if (strcmp(word,input) == 0) 
      break; 
     printf("Try again\n"); 
    } 

    /* terminate repeating message */ 
    printf("Finally!\n"); 
    return 0; 
} 

希望它有帮助!