C-程序将在30秒后终止
问题描述:
我们被要求提示用户输入短语,并继续询问他们,直到他们得到正确的短语所需的时间为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秒后如何终止程序?任何帮助?
答
在这里,您正在使用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;
}
希望它有帮助!
为什么你期望它在'while(1)'卡住时终止? – John3136
那不是30秒。那将是30次迭代。要从开始时间减去当前时间30秒,并寻找30 –
如果你打算这样做,使用'sleep(30);'睡30秒,而不是一个循环。当孩子醒来时,孩子应该向父母发出一个信号,并且如果成功,只报告该时间过期。家长需要处理信号并在收到信号时退出。当给出正确的输入时,它可以决定忽略该信号,以免它过早终止。或者,您可以简单地让代码在一个进程中处理SIGALRM并使用'alarm()'系统调用来设置超时。或者使用其中一种更现代的变体,但是'alarm()'对你来说很好。 –