2016-11-10 88 views
2

我們被要求提示用戶輸入短語,並繼續詢問他們,直到他們得到正確的短語所需的時間爲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()'對你來說很好。 –

回答

3

在這裏,您正在使用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; 
} 

希望它有幫助!