在系统调用期间交互用户空间

时间:2014-06-01 00:42:46

标签: linux-kernel signals system-calls

我试图编写实现读/写操作的块设备驱动程序。 棘手的是,信息不是在硬件中,而是在用户空间过程中。因此,在读/写系统调用期间,我想要交互用户空间(即,将信号发送到用户空间)。 但是,我的用户空间进程仅在读/写系统调用返回后才捕获信号。在系统调用实现中添加wait似乎被忽略了。

我在读取系统调用中使用了此代码:

ssize_t sleepy_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)
{
    struct siginfo info;
    struct task_struct *t;
    int ret;

    #define SIG_TEST 44

    memset(&info, 0, sizeof(struct siginfo));
    info.si_signo = SIG_TEST;
    info.si_code = SI_QUEUE; 
    info.si_int = 1234;
    rcu_read_lock();
    t = pid_task(find_pid_ns(current->pid, &init_pid_ns), PIDTYPE_PID); 
    if(t == NULL){
        printk(KERN_ERR "no such pid\n");
        rcu_read_unlock();
    return -ENODEV;
    }
    rcu_read_unlock();
    ret = send_sig_info(SIG_TEST, &info, t);    //send the signal
    if (ret < 0) {
        printk("error sending signal\n");
    return ret;
    }
    wait_event_interruptible(wq, flag != 0);
    msleep(10000);
    return (0);
}

和用户空间的代码:

#define SIG_TEST 44
int      g_devFile = -1;

void receiveData(int n, siginfo_t *info, void *unused)
{
    printf("received value %i\n", info->si_int);
}

int main(void)
{   
    struct sigaction sig;
    sig.sa_sigaction = receiveData;
    sig.sa_flags = SA_SIGINFO;
    sigaction(SIG_TEST, &sig, NULL);

    g_devFile = open(devname, O_RDWR);
    if ( g_devFile < 0 )  {
        fprintf(stderr,"Error opening device[%s] file       err[%s]\n",devname,strerror(errno));
        return -1;
    } else {
        fprintf (stderr, "device opened. ptr=%p\n", (void*)g_devFile);
    }
    i = read(g_devFile, &buff, 11);
}

目前我只是在10秒睡眠过期后才抓住我的信号(在用户空间中)(等待似乎被忽略)。 任何想法都将被评估。感谢。

0 个答案:

没有答案