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()'系統調用來設置超時。或者使用其中一種更現代的變體,但是'alarm()'對你來說很好。 –