gpt4 book ai didi

使用 C 信号的精密计时器

转载 作者:行者123 更新时间:2023-11-30 17:02:18 25 4
gpt4 key购买 nike

我必须使用 C 信号来做一个天文钟表。想法如下:

  • 使用SIGUSR1:当 child 收到SIGUSR1信号时,它将暂停他的计时器并显示当前状态。 (例如时间:5s)
  • 使用 SIGUSR2:当 child 收到 SIGUSR2 信号时,它将重置他的计时器(将时间设置为 0)

因此,在父级上将有一种带有 2 个选项的界面(我刚刚已经告诉过)。 child 将按照 parent 的信号奔跑。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

void stop_and_continue(int x);
void reset(int x);


int state; //If chrometre is stop (0) or runing (1)
int pid_child;
int time;

int main(void){

int pid;
int option;
system("clear");
pid = fork();

if( pid == 0){ //child (chronometre)
signal(SIGUSR1, stop_and_continue);
signal(SIGUSR2, reset);
time = 0;
state = 0; //Originally the chronometre is stop
pid_child = getpid(); //store child's pid on global to use it on signal functions
pause(); //Wait till parent say to start for the first time
while(1){
sleep(1); //Wait 1 second to make it "real"
time++;
}
}else{ //Parent
printf("1 - Stop - Continue\n");
printf("2 - Reset\n");
printf("0 - Exit\n");
printf("Select one option:\n");
do{
scanf("%d",&option);
if(option == 1){
kill(pid,SIGUSR1);
}else if(option == 2){
kill(pid,SIGUSR2);
}
}while(option!=0);
kill(pid,SIGKILL);
wait(NULL); //Wait till child finish to avoid zombis
}
return 0;
}

void reset(int x){
time = 0;
}

void stop_and_continue(int x){
if(state == 1){
state = 0;
kill(pid_child,SIGSTOP);
}else{
state = 1;
kill(pid_child,SIGCONT);
}

}

最佳答案

不要向自己发送 SIGSTOP 和 SIGCONT。 SIGSTOP 会暂停自己,直到您从其他地方收到 SIGCONT。相反,在您的 while 查看中,添加以检查状态:

while(1){
sleep(1); //Wait 1 second to make it "real"
if (state) {
time++;
}
}

.

void stop_and_continue(int x){
state = !state;
}

关于使用 C 信号的精密计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36605980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com