LINUX.ORG.RU

Сообщения deadedge

 

Список названий доступных сигналов в системе

Форум — Development

Хочу вывести на экран список всех сигналов, доступных в системе, как это делает kill -l. Знаю два способа: 1. Рекомендуемый в signal.h:

void print_signals() {
    for(int i = 0;i<NSIG;i++) {
        printf("%d %s\n", i, strsignal(i));
    }
}

2. Более универсальный

void print_signals() {
    for(int i = 0;i<NSIG;i++)
    {
        printf("%d %s\n", i, sys_siglist[i]);
    }
}

Естественно, не обращаем внимание на отсутствие проверок и тп. Так вот, и тот и другой способ в linux выдает не название сигналов(SIGHUP, SIGINT, SIGQUIT, SIGILL, ....), а их описание: 1 Hangup 2 Interrupt 3 Quit 4 Illegal instruction 5 Trace/breakpoint trap

Беглый осмотр исходников kill показал, что список имен сигналов в ней зашит физически. Скорее всего такой подход себя оправдывает, но, возможно, есть какой-то способ получить список имен без зашивания его в код? Например, названия в netbsd и linux немного отличаются, не хотелось бы городить огород из defineов.

deadedge
()

Работа с устройством через uio_pci_generic

Форум — Development

Приветствую! Нужно написать приложение, которое работает с устройством через драйвер uio_pci_generic. Связал устройство по venid\devid с драйвером. dmesg пишет, что все хорошо: uio_pci_generic 0000:04:0c.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16. Пытаюсь получить доступ к памяти устройства через mmap():

uint32_t *UioMap(int devnum, int map_num)
{
    char *u = (char *) calloc(64, 1);
    sprintf(u, "/sys/class/uio/uio%d/device/resource%d", devnum, map_num);
    int fd = open(u, O_RDONLY);  
    if(fd < 0)
    {
        fprintf(stderr,"Error on open!\n");
        return NULL;
    }
    else fprintf(stderr,"fd = %d\n", fd);
    void* map_addr = mmap(NULL,
            map_sizes[map_num],
            PROT_READ,
            MAP_SHARED,
            fd,
            0);
    if(map_addr == MAP_FAILED)
    {
        perror("mmap");
    }
    return (uint32_t *) map_addr;
}

вроде mmap() проходит - ошибок не выдает, указатели «валидные», но в папке /sys/class/uio/uio0/ не появляются каталоги mapX, ну и при обращении к памяти по указателям происходит segfault. Кто-нибудь использовал функционал этого драйвера в жизни? Может надо какие-то хитрые параметры давать mmap()?

deadedge
()

RSS подписка на новые темы