2016-04-13 67 views
0

我必須使用C信號做天文臺。這個想法如下:使用C信號的天文臺

  • 使用SIGUSR1:當孩子獲得SIGUSR1信號時,它會暫停他的計時器並顯示當前狀態。 (例如時間:5秒)
  • 使用SIGUSR2:當孩子得到SIGUSR2信號,它會重置他的秒錶(通過將它的時間爲0)

所以父將是一種接口與2選項(我剛剛講過)。這個孩子將會開始照顧父母的信號。

#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

孩子和父親?你的意思是孩子和父母? –

+0

是的,對不起,我是西班牙語,我試圖快速進行編輯,我會編輯它 –

+0

我不確定,如果進程能夠處理SIGSTOP後的用戶信號。你確定,這個開始/停止的作品? – Ivan

回答

0

不要發送SIGSTOP和SIGCONT給自己。 SIGSTOP會暫停你自己,直到你從其他地方收到一個SIGCONT。相反,在你的外觀裏面,加入以檢查狀態:

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

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