2016-04-13 14 views
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); 
} 

}

+0

Çocuk ve baba? Çocuk ve ebeveyn mi demek istiyorsun? –

+0

Evet, üzgünüm ispanyolca ve çabucak paramparça etmeye çalışıyorum, düzenleyeceğim –

+0

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

cevap

0

kendinize SIGSTOP ve SIGCONT göndermeyin. SIGSTOP, başka bir yerden bir SIGCONT elde edene kadar kendi kendini HALT. Bunun yerine, görünümünüzün içine bakın, durumu kontrol etmek için ekleyin:

.

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