2017-02-20 27 views
0

Итак, я создаю обработчик сигнала, чтобы изменить скорость вывода вывода на экран. Вывод выполняется процессом, который печатает на другом терминале, но при этом позволяет пользователю вводить ввод, такой как «+», чтобы увеличить скорость чтения и «-», чтобы уменьшить скорость.Отправка переменной, измененной сигналом, в процесс, созданный exec в дочернем процессе. [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; 
} 

В идущем состоянии (going.c) мой мыслительный процесс заключается в создании Летучие переменных секунд и наносекунд и использовать эти переменные, чтобы обновить функцию nanosleep(), что outputTerminal использует для чтения линий 1 линия, в то время как это в фрагмент кода ниже. Это возможно? Это вопрос домашнего задания кстати. У меня есть все функции, работающие так, как будто они должны мне просто нужно выяснить, как отправлять переменные, измененные сигналом, на этот процесс. Я попытался сделать 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); 

Это мой обработчик сигнала

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

Что вы ищете называется IPC, коротка для связи между процессами, и есть много способов сделать то, что вы хотите. Ваш подход не работает, потому что ваши процессы имеют разные адресные пространства, поэтому изменение переменной в одном не влияет на другое.

несколько способов, которыми вы могли бы передавать информацию от одного процесса к другому:

  • разделяемой памяти между процессами (используя mmap с MAP_SHARED)
  • Отправить дополнительную информацию с помощью сигналов (посмотреть sigqueue и sigval. Или, может проверить этот старый ответ https://stackoverflow.com/a/7270506)
  • Используйте pipe
  • Или message queue

Существует еще несколько механизмов, но это должно помочь вам начать работу.

+0

Итак, я изменил код на то, что он на самом деле предполагает. Просто создайте ребенка и используйте execl. Мы, по-видимому, только предполагаем использовать сигналы для этого, которые просто не имеют для меня смысла. Sigqueue выглядел так, как будто было бы неплохо, но, по-видимому, его не поддерживали на mac sierra. – WizKiz

+0

Итак, что я сделал, чтобы исправить мою проблему, я положил обработчик сигнала в процесс, который печатал текст на другом терминале, а затем использовал мой родительский процесс для отправки сигналов на него, и я использовал два сигнала для увеличения скорости и уменьшения скорости. – WizKiz

+0

@WizKiz. Одна проблема с «классическими» сигналами заключается в том, что никто не уверен, получает ли целевой процесс сигнал (и один не уверен, что произойдет, если сигнал отправляется несколько раз подряд). – cnicutar