Бяхме помолени да подканим потребителя да въвежда фрази и да продължим да го питаме, докато получи необходимата правилна фраза, в продължение на 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)
? - person John3136   schedule 10.11.2016sleep(30);
, за да спите 30 секунди вместо цикъл. Детето трябва да изпрати сигнал на родителя, когато се събуди и да съобщи, че времето е изтекло само ако това е успешно. Родителят трябва да се справи със сигнала и да излезе, когато бъде получен. Когато се даде правилен вход, той може да реши да игнорира сигнала, така че да не бъде прекратен преждевременно. Като алтернатива, можете просто да имате кода в единична обработка на процеса SIGALRM и да използвате системното повикванеalarm()
, за да зададете таймаут. Или използвайте един от различните по-модерни варианти, ноalarm()
е подходящ за вас. - person Jonathan Leffler   schedule 10.11.2016