0
C sinyallerini kullanarak bir Kronometre yapmak zorundayım. Şu fikir şudur:C sinyallerini kullanarak Kronometre
- SIGUSR1 kullanın: çocuk SIGUSR1 sinyali aldığında, chronometresini duraklatır ve mevcut durumu gösterir. (Örneğin süre: 5s)
- Kullanım SIGUSR2: çocuk aldığında SIGUSR2 onun kronometre sıfırlanır sinyal 2 ile arabiriminin bir tür olacak Yani ebeveyn üzerinde
(koyarak 0'a zamanı) seçenekler (az önce söylediğim). Çocuk ebeveynin sinyallerine katılıyor olacak.
#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);
}
}
Çocuk ve baba? Çocuk ve ebeveyn mi demek istiyorsun? –
Evet, üzgünüm ispanyolca ve çabucak paramparça etmeye çalışıyorum, düzenleyeceğim –
SIGSTOP'tan sonra kullanıcı-sinyalleri işlemek mümkün ise, emin değilim. Bu başlangıç / duruşun işe yaradığından emin misin? – Ivan