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);
}
}
孩子和父親?你的意思是孩子和父母? –
是的,對不起,我是西班牙語,我試圖快速進行編輯,我會編輯它 –
我不確定,如果進程能夠處理SIGSTOP後的用戶信號。你確定,這個開始/停止的作品? – Ivan