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秒後にプログラムを終了するにはどうしたらいいですか?どんな助け?
なぜあなたは 'while(1)'で立ち往生したときに終了すると思いますか? – John3136
これは30秒ではありません。それは30反復です。 30秒を取得するには、開始時刻から現在の時刻を引いて30を探します。 –
このようにすれば、 'sleep(30);'を使ってループの代わりに30秒間スリープします。子供は目を覚ましたときに親に信号を送り、成功した場合にはその時間が満了したと報告するだけです。親は信号を処理し、信号が受信されると終了する必要があります。正しい入力が与えられると、信号を無視して早期に終了しないようにすることができます。あるいは、単一のプロセスでコードをSIGALRMで処理し、 'alarm()'システムコールを使ってタイムアウトを設定することもできます。あるいは、さまざまなより現代的な変種のうちの1つを使用してください。しかし、 'alarm()'はうまくいきます。 –