신호를 사용하여 여러 신호를 처리하여 다양한 작업을 수행하는 C++ 프로그램이 있습니다.
signal(SIGHUP, signal_handler);
나는 이 신호 처리를 확장하여 프로그램에 다양한 작업 요청을 보낼 수 있도록 하고 싶었고 sigaction을 사용하면 신호와 함께 추가 정보를 받을 수 있다는 것을 알았습니다.
sigaction(SIGUSR1, &act, 0);
내가 아는 한, sigval 개체에 추가 정보를 설정하여 수신 측에서 프로그램이 수행하도록 요청받는 작업을 알 수 있도록 하여 다른 프로그램에서 이러한 유형의 신호를 보낼 수 있습니다.
내가 알고 싶은 것은 bash의 쉘 스크립트를 통해 이러한 유형의 신호 정보를 보내는 방법입니다. 가능합니까? 를 사용하여 내 프로그램에 신호를 보낼 수 있지만 를 kill -S SIGHUP [PID]
사용하여 추가 매개변수를 보내는 방법을 찾을 수 없습니다 kill
. 그래서 bash에 sigaction / sigqueue 의 동작을 시뮬레이션하여 신호를 보낼 수 있는 명령이 있는지 궁금합니다. 작업을 수행하기 위해 다른 앱을 개발할 필요 없이 내 애플리케이션입니다.
답변1
이것은 작동합니다. 먼저, 추가 정보에 대한 관심을 나타내 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
.
맨페이지에서는 이를 기반으로 구축하는 방법에 대한 자세한 정보를 제공합니다.
답변2
귀하의 정보가 오래된 것 같습니다. 내 sigaction
매뉴얼 페이지에서 :
문서화되지 않았습니다. SA_SIGINFO가 도입되기 전에는 struct sigcontext 유형의 두 번째 매개변수와 함께 sa_handler를 사용하여 일부 추가 정보를 얻을 수도 있었습니다.이 사용법은 이제 더 이상 사용되지 않습니다.
답변3
추가 매개변수는 sigqueue()
및 를 사용하여 보내고 받을 수 있습니다 . "이 사용법은 이제 더 이상 사용되지 않습니다"는 두 번째 인수가 인 두 개의 인수를 사용하는 것을 의미할 수 있습니다 . 도입 후에는 모든 핸들러가 이 필드와 함께 매개변수를 사용하므로 문서화되지 않은 핸들러를 사용할 필요가 없습니다 .si_value
siginfo_t
sigaction()
sa_handler
sigcontext
SA_SIGINFO
siginfo_t
si_value
그러나 쉘의 페이로드로 신호를 대기열에 넣는 방법을 모르겠습니다. 이를 위해 작은 C 프로그램을 작성해야 할 수도 있습니다.
답변4
이제 procps-ng의 최신 버전 kill을 사용하여 이 작업을 수행할 수 있습니다.
kill -q <value> -<signal> <pid>
바라보다:https://gitlab.com/procps-ng/procps/-/merge_requests/32