Linux에서 역순으로 수신 된 실시간 신호

티모시 레이비에

이 프로그램은 실시간 신호를 자신에게 보내고 처리합니다. 처리가 완료되면 수신 한 신호를 수신 한 순서대로 출력합니다.

$ cat realtime.c
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int received_signals[10];
int received_signals_value[10];
int received_signals_count = 0;

void real_time_handler(int sig_number, siginfo_t * info,
                       void * arg __attribute__ ((unused)))
{
    received_signals[received_signals_count] = sig_number - SIGRTMIN;
    received_signals_value[received_signals_count] = info->si_value.sival_int;
    ++received_signals_count;
}

void send_real_time_signal(int sig_number, int value)
{
    union sigval sig_value;

    printf("Sending signal SIRTMIN+%d, value %d\n", sig_number, value);
    sig_value.sival_int = value;
    if (sigqueue(getpid(), sig_number + SIGRTMIN, sig_value) < 0) {
        perror("sigqueue");
        exit(EXIT_FAILURE);
    }
}

int main()
{
    struct sigaction action;
    sigset_t set;
    int i;

    // Handler setup
    action.sa_sigaction = real_time_handler;
    sigemptyset(&action.sa_mask);
    action.sa_flags = SA_SIGINFO;
    if ((sigaction(SIGRTMIN + 1, & action, NULL) < 0)
     || (sigaction(SIGRTMIN + 2, & action, NULL) < 0)
     || (sigaction(SIGRTMIN + 3, & action, NULL) < 0)) {
        perror("sigaction");
        exit(EXIT_FAILURE);
    }

    // Block all signals
    sigfillset(&set);
    sigprocmask(SIG_BLOCK, &set, NULL);

    send_real_time_signal(1, 0);
    send_real_time_signal(2, 1);
    send_real_time_signal(3, 2);
    send_real_time_signal(1, 3);
    send_real_time_signal(2, 4);
    send_real_time_signal(3, 5);
    send_real_time_signal(3, 6);
    send_real_time_signal(2, 7);
    send_real_time_signal(1, 8);
    send_real_time_signal(3, 9);

    // Unblock all signals
    sigfillset(&set);
    sigprocmask(SIG_UNBLOCK, &set, NULL);

    // To make sure we're handling all signals before resuming
    sleep(1);

    // Display results
    for (i = 0; i < received_signals_count; ++i) {
        printf("Received signal SIGRTMIN+%d, value %d\n",
               received_signals[i], received_signals_value[i]);
    }

    return EXIT_SUCCESS;
}

나는 일관되게 아래 출력을 얻습니다.

$ gcc -Wall -Wextra -O2 -o realtime realtime.c
$ ./realtime
Sending signal SIRTMIN+1, value 0
Sending signal SIRTMIN+2, value 1
Sending signal SIRTMIN+3, value 2
Sending signal SIRTMIN+1, value 3
Sending signal SIRTMIN+2, value 4
Sending signal SIRTMIN+3, value 5
Sending signal SIRTMIN+3, value 6
Sending signal SIRTMIN+2, value 7
Sending signal SIRTMIN+1, value 8
Sending signal SIRTMIN+3, value 9
Received signal SIGRTMIN+3, value 2
Received signal SIGRTMIN+3, value 5
Received signal SIGRTMIN+3, value 6
Received signal SIGRTMIN+3, value 9
Received signal SIGRTMIN+2, value 1
Received signal SIGRTMIN+2, value 4
Received signal SIGRTMIN+2, value 7
Received signal SIGRTMIN+1, value 0
Received signal SIGRTMIN+1, value 3
Received signal SIGRTMIN+1, value 8

signal (7) ( http://man7.org/linux/man-pages/man7/signal.7.html )에 쓰여진 내용과 모순됩니다 .

실시간 신호는 보장 된 순서로 전달됩니다. 동일한 유형의 여러 실시간 신호가 전송 된 순서대로 전달됩니다. 다른 실시간 신호가 프로세스로 전송되면 가장 낮은 번호의 신호부터 전달됩니다. (즉, 낮은 번호의 신호가 가장 높은 우선 순위를 갖습니다.) 반면에 프로세스에 대해 여러 표준 신호가 보류중인 경우 전달되는 순서가 지정되지 않습니다.

내가 이해하는 한 다음을 받아야합니다.

$ ./realtime
Sending signal SIRTMIN+1, value 0
Sending signal SIRTMIN+2, value 1
Sending signal SIRTMIN+3, value 2
Sending signal SIRTMIN+1, value 3
Sending signal SIRTMIN+2, value 4
Sending signal SIRTMIN+3, value 5
Sending signal SIRTMIN+3, value 6
Sending signal SIRTMIN+2, value 7
Sending signal SIRTMIN+1, value 8
Sending signal SIRTMIN+3, value 9
Received signal SIGRTMIN+1, value 0
Received signal SIGRTMIN+1, value 3
Received signal SIGRTMIN+1, value 8
Received signal SIGRTMIN+2, value 1
Received signal SIGRTMIN+2, value 4
Received signal SIGRTMIN+2, value 7
Received signal SIGRTMIN+3, value 2
Received signal SIGRTMIN+3, value 5
Received signal SIGRTMIN+3, value 6
Received signal SIGRTMIN+3, value 9

Linux 커널 소스 코드를 빠르게 살펴 보았지만 실시간 신호가 처리되는 곳을 (아직) 찾을 수 없었습니다.

내가 뭔가 잘못했거나 빠졌거나 매뉴얼 페이지가 부정확합니까?

냉소

문제는 다른 신호가 실행중인 신호 처리기를 중단하도록 허용한다는 것입니다.

sigemptyset(&action.sa_mask);

sa_mask필드는이 핸들러의 실행을 중단 할 수없는 신호 집합을 지정합니다.

이것은 SIGRTMIN + 1당신이 그것에 대해 무엇이든 할 수 있기 전에 당신 이 처리하기 시작하는 다른 더 낮은 우선 순위 신호얻는다는 것을 의미합니다 . 그 신호는 차례로 또 다른 신호에 의해 중단됩니다.

이 문제를 해결하려면 다른 신호가 핸들러를 방해하지 않도록합니다.

sigfillset(&action.sa_mask);

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

수신 된 신호에 무언가를 만드십시오

분류에서Dev

setTimeout은 함수 호출에서 전달 된 시간 대신 즉시 실행됩니다.

분류에서Dev

Linux에서 무시 된 신호의 마스크 재설정

분류에서Dev

Flutter / Dart-getter 'path'가 null에서 호출되었습니다. 수신자 : null 시도 된 호출 : 경로

분류에서Dev

실시간 신호로 float 값을 보낼 수 있습니까?

분류에서Dev

신속 : 매주 예정된 시간에 함수를 실행하는 방법

분류에서Dev

pyqt에서 실시간 신호를 어떻게 그릴 수 있습니까?

분류에서Dev

Thunderbird에서 설정된 시간에만 메일 수신

분류에서Dev

std :: thread C ++ 11 생성시 수신 된 SIGABRT 신호

분류에서Dev

시간 간격 당 각 신호에 대해 집계 된 값을 사용하여 개별 신호 스트림을 하나의 테이블로 결합

분류에서Dev

sigaction으로 신호 수신시 프로세스 재시작

분류에서Dev

Ubuntu가로드 된 다음 모니터에서 신호가 손실됩니까?

분류에서Dev

프로그램 수신 신호 SIGPIPE, 파손 된 파이프

분류에서Dev

Qt로 hh : mm과 같은 특수 시간에 신호 보내기

분류에서Dev

주파수 대역에 대한 Python 신호 시뮬레이션

분류에서Dev

Docker 컨테이너에서 호스트 머신과 동기화 된 시간

분류에서Dev

기호 텐서가 아닌 입력으로 레이어가 호출되었습니다. 수신 된 유형 '순차'

분류에서Dev

Node-RED는 실시간으로 PostgreSQL을 수신합니다.

분류에서Dev

신호의 위상 fft를 얻는 방법 &-시간 영역에서 위상을 얻을 수 있습니까?

분류에서Dev

NSubstitute로 인덱서로 수신 된 호출을 확인하는 방법

분류에서Dev

시스템 재부팅으로 생성 된 신호 처리

분류에서Dev

GStreamer에서 Numpy 배열 실시간 수신

분류에서Dev

간단한 배열로 된 JSONObject에서 데이터를 수신하는 방법

분류에서Dev

SetWindowsHookEx ()에 의해 설정된 후크는 어떤 순서로 메시지를 수신합니까?

분류에서Dev

AngularJS의 격리 된 범위 / 지시문에서 브로드 캐스트를 수신하고 컨트롤러 함수를 호출합니까?

분류에서Dev

신속하게 일정한 시간 간격으로 서비스 호출

분류에서Dev

Android에서 사용자 상호 작용없이 실제적으로 수신자 호출을받는 방법

분류에서Dev

mvc에서 구성된 도메인으로 이메일 수신

분류에서Dev

Python3 ZMQ, Interrupt 함수 및 수신 된 각 새 메시지에서 다른 호출

Related 관련 기사

  1. 1

    수신 된 신호에 무언가를 만드십시오

  2. 2

    setTimeout은 함수 호출에서 전달 된 시간 대신 즉시 실행됩니다.

  3. 3

    Linux에서 무시 된 신호의 마스크 재설정

  4. 4

    Flutter / Dart-getter 'path'가 null에서 호출되었습니다. 수신자 : null 시도 된 호출 : 경로

  5. 5

    실시간 신호로 float 값을 보낼 수 있습니까?

  6. 6

    신속 : 매주 예정된 시간에 함수를 실행하는 방법

  7. 7

    pyqt에서 실시간 신호를 어떻게 그릴 수 있습니까?

  8. 8

    Thunderbird에서 설정된 시간에만 메일 수신

  9. 9

    std :: thread C ++ 11 생성시 수신 된 SIGABRT 신호

  10. 10

    시간 간격 당 각 신호에 대해 집계 된 값을 사용하여 개별 신호 스트림을 하나의 테이블로 결합

  11. 11

    sigaction으로 신호 수신시 프로세스 재시작

  12. 12

    Ubuntu가로드 된 다음 모니터에서 신호가 손실됩니까?

  13. 13

    프로그램 수신 신호 SIGPIPE, 파손 된 파이프

  14. 14

    Qt로 hh : mm과 같은 특수 시간에 신호 보내기

  15. 15

    주파수 대역에 대한 Python 신호 시뮬레이션

  16. 16

    Docker 컨테이너에서 호스트 머신과 동기화 된 시간

  17. 17

    기호 텐서가 아닌 입력으로 레이어가 호출되었습니다. 수신 된 유형 '순차'

  18. 18

    Node-RED는 실시간으로 PostgreSQL을 수신합니다.

  19. 19

    신호의 위상 fft를 얻는 방법 &-시간 영역에서 위상을 얻을 수 있습니까?

  20. 20

    NSubstitute로 인덱서로 수신 된 호출을 확인하는 방법

  21. 21

    시스템 재부팅으로 생성 된 신호 처리

  22. 22

    GStreamer에서 Numpy 배열 실시간 수신

  23. 23

    간단한 배열로 된 JSONObject에서 데이터를 수신하는 방법

  24. 24

    SetWindowsHookEx ()에 의해 설정된 후크는 어떤 순서로 메시지를 수신합니까?

  25. 25

    AngularJS의 격리 된 범위 / 지시문에서 브로드 캐스트를 수신하고 컨트롤러 함수를 호출합니까?

  26. 26

    신속하게 일정한 시간 간격으로 서비스 호출

  27. 27

    Android에서 사용자 상호 작용없이 실제적으로 수신자 호출을받는 방법

  28. 28

    mvc에서 구성된 도메인으로 이메일 수신

  29. 29

    Python3 ZMQ, Interrupt 함수 및 수신 된 각 새 메시지에서 다른 호출

뜨겁다태그

보관