rt-thread icon indicating copy to clipboard operation
rt-thread copied to clipboard

[Feature] sigaction support siginfo

Open wycwyhwyq opened this issue 9 months ago • 0 comments

Describe problem solved by the proposed feature

sigaction信号处理支持siginfo。多个软件timer就可以使用一个信号处理函数,通过sigval进行区分。同时某些可能使用到信号的设备驱动也能传递更多的参数到用户层。

Describe your preferred solution

比如下面的例子

#include <signal.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

#define CLOCKID CLOCK_REALTIME
#define SIG SIGRTMIN

#define errExit(msg)        \
    do {                    \
        perror(msg);        \
        exit(EXIT_FAILURE); \
    } while (0)

static void print_siginfo(siginfo_t* si)
{
    timer_t* tidp;

    tidp = si->si_value.sival_ptr;

    printf("si_signo = %d\n", si->si_signo);
    printf("si_code = %d\n", si->si_code);
    printf("si_errno = %d\n", si->si_errno);
    printf("timer ID is %#lx\n", (uintmax_t)*tidp);
}

static void handler(int sig, siginfo_t* si, void* uc)
{
    printf("Caught signal %d\n", sig);
    print_siginfo(si);
}

int main(int argc, char* argv[])
{
    timer_t timerid;
    struct sigevent sev;
    struct sigaction sa;
    struct itimerspec its;

    /* Establish handler for timer signal. */
    printf("Establishing handler for signal %d\n", SIG);
    sa.sa_flags = SA_SIGINFO;
    sa.sa_sigaction = handler;
    sigemptyset(&sa.sa_mask);
    if (sigaction(SIG, &sa, NULL) == -1)
        errExit("sigaction");

    /* Create the timer. */
    sev.sigev_notify = SIGEV_SIGNAL;
    sev.sigev_signo = SIG;
    sev.sigev_value.sival_ptr = &timerid;
    if (timer_create(CLOCKID, &sev, &timerid) == -1)
        errExit("timer_create");

    printf("timer ID is %#lx\n", (uintmax_t)timerid);

    /* Start the timer. */
    its.it_value.tv_sec = 1;
    its.it_value.tv_nsec = 0;
    its.it_interval.tv_sec = 0;
    its.it_interval.tv_nsec = 0;
    if (timer_settime(timerid, 0, &its, NULL) == -1)
        errExit("timer_settime");

    sleep(2);

    exit(EXIT_SUCCESS);
}

Describe possible alternatives

No response

wycwyhwyq avatar Feb 28 '25 08:02 wycwyhwyq