Отправка sigaction / sigqueue через оболочку

У меня есть программа на C ++, которая обрабатывает несколько сигналов для выполнения различных действий, используя сигнал:

signal(SIGHUP, signal_handler); 

Я хотел расширить эту обработку сигналов, чтобы позволить мне отправлять разные запросы на действия в мою программу и обнаружил, что с помощью sigaction я мог бы получать дополнительную информацию вместе с сигналом:

  sigaction(SIGUSR1, &act, 0); 

Для того, что я мог найти, я могу отправить этот тип сигналов из других программ, установив дополнительную информацию об объекте sigval, чтобы я знал, на получающей стороне, что программа запросила.

Я хотел бы знать, как я могу отправить этот тип сигнала через скрипт оболочки в bash. Является ли это возможным? Я могу отправлять сигналы в свою программу, используя kill -S SIGHUP [PID] но я не нахожу способ отправить этот дополнительный параметр с помощью kill , поэтому мне было интересно, есть ли команда bash, которая эмулирует поведение sigaction / sigqueue, позволяя мне отправлять сигналы в мое приложение, не разрабатывая другое приложение для выполнения этой работы.

Ваша информация, похоже, устарела. С моей sigaction man sigaction :

Незарегистрированные. До введения SA_SIGINFO также можно было получить дополнительную информацию, а именно, используя sa_handler со вторым аргументом типа struct sigcontext. Это использование устарело.

Можно отправлять и получать дополнительные параметры с помощью sigqueue() и si_value в siginfo_t . «Это использование устарело сейчас» в sigaction() , возможно, относится к использованию sa_handler с двумя аргументами, а второй – sigcontext . После введения SA_SIGINFO нет необходимости использовать такой недокументированный обработчик, поскольку все обработчики принимают аргумент siginfo_t который имеет поле si_value .

Тем не менее, я не знаю способ поставить в очередь сигнал с полезной нагрузкой из оболочки, для этого вам может понадобиться написать небольшую программу на C.

Это работает. Сначала установите SA_SIGINFO в .sa_flags чтобы сообщить о дополнительной информации:

 #include <signal.h> #include <unistd.h> void act(int s, siginfo_t *i, void *v) { //printing from here is unsafe but this is for testing //purposes only printf("pid=%d val=%d\n", i->si_pid, i->si_value.sival_int); } int main(int argc, char **argv) { struct sigaction sa = { .sa_sigaction=act , .sa_flags = SA_RESTART|SA_SIGINFO } ; sigaction(SIGUSR1, &sa, NULL); printf("%d\n", (int)getpid()); for(;;){ pause(); } } 

Во-вторых, создайте собственное приложение kill (er), способное отправить дополнительную информацию:

 #include <signal.h> #include <unistd.h> int main(int argc, char**argv) { union sigval val = { .sival_int = atoi(argv[2]) }; sigqueue((pid_t)atoi(argv[1]), SIGUSR1, val); } 

Вы можете попробовать скомпилировать эти два, и вы сможете использовать второй исполняемый файл для отправки целых чисел в первый ( ./second pid int ).

Справочники должны предоставить вам дополнительную информацию о том, как это сделать.