2017-02-20 4 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; 
} 

は、volatile変数の秒とナノ秒を作成し、出力端子はそうのように一度に行に1行を読み取るために使用しているnanosleep()機能を更新するために、これらの変数を使用していました以下のコードスニペット。これは可能ですか?これは宿題に関する質問です。私はすべての機能を持っているように思っています。信号によって変更された変数をそのプロセスに送信する方法を理解するだけです。私は、シグナルハンドラを設定した後、進行中の状態でkill(baby_pid,SIGUSR1)を実行しようとしました。なぜなら、pidを保存したが、それは何らかの理由でプロセス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

であり、あなたがやりたいことには多くの方法があります。 プロセスに異なるアドレススペースがあるため、1つの変数を変更しても別のアドレススペースに影響しないため、アプローチは機能しません。

あなたが別のプロセスからの情報を伝えることができているいくつかの方法:

さらに多くのメカニズムがありますが、これはあなたを始めなければなりません。

+0

だから私は実際にやるべきことにコードを修正しました。子供を作り、execlを使うだけです。私たちは、明らかに私には意味をなさない信号だけを使用していると思われます。 Sigqueueはうまくいきましたが、明らかにMac Sierraではサポートされていません – WizKiz

+0

さて、問題を解決するために、他の端末のテキストを印刷して親プロセスを使用していたプロセスにシグナルハンドラを入れましたそれに信号を送るために、私は速度と速度を下げるために2つの信号を使いました。 – WizKiz

+0

@WizKiz "古典的な"シグナルの1つの問題は、ターゲットプロセスがシグナルを受信するかどうかが不明であることです。シグナルが連続して複数回送信された場合どうなるかはわかりません。 – cnicutar

関連する問題