2017-02-20 1 views
0

그래서 신호 처리기를 생성하여 출력이 화면에 출력되는 속도를 수정합니다. 출력은 다른 터미널을 열어 인쇄하면서 사용자가 '+'와 같은 입력을 허용하여 읽기 속도를 높이고 '-'를 사용하여 속도를 줄이는 프로세스에 의해 수행됩니다.자식 프로세스에서 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;              
     }                  
    }                   
} 

답변

0

입니다. 프로세스가 고유 한 주소 공간을 가지고 있으므로 변수를 변경하면 다른 주소 공간에는 영향을 미치지 않으므로 접근 방식이 작동하지 않습니다.

당신이 다른 하나 개의 프로세스에서 정보를 교환 할 수있는 몇 가지 방법 :

메커니즘이 많이 있지만 이것은 시작해야합니다.

+0

그래서 실제로 코드를 수정했습니다. 그냥 자식을 만들고 execl을 사용하십시오. 우리는 분명히 나에게 의미가없는 신호만을 사용한다고 가정합니다. Sigqueue는 멋져 보였지만 분명히 Mac 시에라에서는 지원되지 않았다. – WizKiz

+0

좋아, 내 문제를 해결하기 위해 다른 터미널의 텍스트를 인쇄하고 부모 프로세스를 사용하는 프로세스에 신호 처리기를 넣었다. 신호를 보내려면 속도를 높이고 속도를 줄이기 위해 두 가지 신호를 사용했습니다. – WizKiz

+0

@WizKiz "클래식"신호의 한 가지 문제점은 대상 프로세스가 신호를 수신하는지 여부가 확실하지 않다는 것입니다. 신호가 빠르게 연속해서 여러 번 전송 될 경우 어떤 일이 발생할지 확실하지 않습니다. – cnicutar

관련 문제