Итак, я создаю обработчик сигнала, чтобы изменить скорость вывода вывода на экран. Вывод выполняется процессом, который печатает на другом терминале, но при этом позволяет пользователю вводить ввод, такой как «+», чтобы увеличить скорость чтения и «-», чтобы уменьшить скорость.Отправка переменной, измененной сигналом, в процесс, созданный 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;
}
}
}
Итак, я изменил код на то, что он на самом деле предполагает. Просто создайте ребенка и используйте execl. Мы, по-видимому, только предполагаем использовать сигналы для этого, которые просто не имеют для меня смысла. Sigqueue выглядел так, как будто было бы неплохо, но, по-видимому, его не поддерживали на mac sierra. – WizKiz
Итак, что я сделал, чтобы исправить мою проблему, я положил обработчик сигнала в процесс, который печатал текст на другом терминале, а затем использовал мой родительский процесс для отправки сигналов на него, и я использовал два сигнала для увеличения скорости и уменьшения скорости. – WizKiz
@WizKiz. Одна проблема с «классическими» сигналами заключается в том, что никто не уверен, получает ли целевой процесс сигнал (и один не уверен, что произойдет, если сигнал отправляется несколько раз подряд). – cnicutar