그래서 신호 처리기를 생성하여 출력이 화면에 출력되는 속도를 수정합니다. 출력은 다른 터미널을 열어 인쇄하면서 사용자가 '+'와 같은 입력을 허용하여 읽기 속도를 높이고 '-'를 사용하여 속도를 줄이는 프로세스에 의해 수행됩니다.자식 프로세스에서 exec에 의해 생성 된 프로세스에 신호로 변경된 변수 보내기 [C]
코드는 다음과 유사합니다. 가고있는 상태 (going.c
) 내 생각 과정에서
static state* start_button(void)
{
state *destination;
pid_t pid;
pid = fork();
switch(pid)
{
case -1:
destination = &ready;
break;
case 0:
execl("./outputTerminal",
"outputTerminal",file_number,"/dev/ttys001",NULL);
break;
default:
destination = &going;
break;
}
return destination;
}
는 휘발성 변수 초와 나노초를 만들고 outputTerminal 지금처럼 한 번에 라인 1 개 라인을 읽기 위해 사용하는 nanosleep()
기능을 업데이트 할 그 변수를 사용하는 것이 었습니다 아래의 코드 스 니펫. 이것이 가능한가? 이것은 숙제 문제 btw입니다. 나는 신호 처리에 의해 변수를 변경하는 방법을 알아낼 필요가있는 것처럼 모든 기능을 수행한다. 내가 pid를 저장했기 때문에 신호 처리기를 설정 한 후 진행 상태에서 kill(baby_pid,SIGUSR1)
을 시도했지만 그 이유는 단지 프로세스 outputTerminal을 죽이는 것뿐입니다.
//going.c
volatile sig_atomic_t seconds;
volatile sig_atomic_t nanoseconds; //Update these in the going state
//Then pass them to the process outputTerminal like so
//outputTerminal.c
struct timespec tm1,tm2;
tm1.tv_sec = seconds;
tm2.tv_nsec = nanoseconds;
nanosleep(&tm1,&tm2);
이 프로세스 간 통신을위한 짧은, IPC라고 당신이 원하는 것을 할 수있는 많은 방법이 무엇 당신이 찾고있는 내 신호 처리기
static void speed_handler(int signal)
{
long max_nano = 1000000000L;
long incrementer = 250000000L;
if(speed_control == 0)
{
if(nanoseconds == 0L && seconds > 0)
{
seconds -= 1;
nanoseconds = max_nano;
}
if(nanoseconds != 0L)
nanoseconds -= incrementer;
}
if(speed_control == 1)
{
nanoseconds += incrementer;
if(nanoseconds >= max_nano)
{
nanoseconds = 0L;
seconds += 1;
}
}
}
그래서 실제로 코드를 수정했습니다. 그냥 자식을 만들고 execl을 사용하십시오. 우리는 분명히 나에게 의미가없는 신호만을 사용한다고 가정합니다. Sigqueue는 멋져 보였지만 분명히 Mac 시에라에서는 지원되지 않았다. – WizKiz
좋아, 내 문제를 해결하기 위해 다른 터미널의 텍스트를 인쇄하고 부모 프로세스를 사용하는 프로세스에 신호 처리기를 넣었다. 신호를 보내려면 속도를 높이고 속도를 줄이기 위해 두 가지 신호를 사용했습니다. – WizKiz
@WizKiz "클래식"신호의 한 가지 문제점은 대상 프로세스가 신호를 수신하는지 여부가 확실하지 않다는 것입니다. 신호가 빠르게 연속해서 여러 번 전송 될 경우 어떤 일이 발생할지 확실하지 않습니다. – cnicutar