2016-11-10 32 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()'システムコールを使ってタイムアウトを設定することもできます。あるいは、さまざまなより現代的な変種のうちの1つを使用してください。しかし、 'alarm()'はうまくいきます。 –

答えて

3

ここでは、2つの異なるPIDを持つ2つの別々のプロセスを作成するforkを使用しています。あなたは子プロセスを殺していますが、親プロセスはまだ実行中ですので、プログラムは終了しません。

フォークの代わりにpthreadを使用することもできますが、これは同じ単一プロセスで残りますが、達成しようとしていることはアラーム機能を持つ単純なものです。あなたは他のプロセスを管理する必要はありません。ただアラームを使用してください。

#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; 
} 

希望すると助かります!

関連する問題