Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在用户空间应用程序中使用自旋锁_C_Linux_Linux Kernel_Locking_Linux Device Driver - Fatal编程技术网

C 在用户空间应用程序中使用自旋锁

C 在用户空间应用程序中使用自旋锁,c,linux,linux-kernel,locking,linux-device-driver,C,Linux,Linux Kernel,Locking,Linux Device Driver,我试图创建一个具有结构的内核模块&我希望在用户空间应用程序中使用相同的结构,并且该应用程序与给定的模块一起工作 主要问题是此结构包含一个名为spinlock\u t type的变量。它在内核中用于锁定,但不知道如何在用户空间应用程序中使用它 struct new_struct { ...some variable... spinlock_t u_lock; }; 是否有任何方法可以在用户空间应用程序中使用旋转锁 struct new_struct { ...some variabl

我试图创建一个具有结构的内核模块&我希望在用户空间应用程序中使用相同的结构,并且该应用程序与给定的模块一起工作

主要问题是此结构包含一个名为
spinlock\u t type
的变量。它在内核中用于锁定,但不知道如何在用户空间应用程序中使用它

struct new_struct
{
  ...some variable...
  spinlock_t u_lock;
};
是否有任何方法可以在用户空间应用程序中使用旋转锁

struct new_struct
{
  ...some variable...
  spinlock_t u_lock;
};

或者是否还有其他锁定技术可以在内核和用户空间中使用,这样,如果锁由用户应用程序持有,内核模块将无法获得锁,反之亦然。

我知道此结构在内存中,由内核和用户进程共享。如果没有,您可以使用
ifdef KERNEL
在内核和用户空间中使用不同的锁定

但是如果它是共享的,就不能在它上面使用Spinglock,因为不允许用户空间阻塞内核

处理它的简单方法是将所有信息放在内核中,并让用户空间代码发出系统调用来访问它


另一种方法是使用无锁数据结构(环形缓冲区很流行)进行此通信。

自旋外观是内核结构,不能在用户空间中使用。 对于用户空间,像pthread mutex这样的互斥是最好的方式

如果您希望相同的代码也在用户空间和内核模式下工作,那么需要使用ifdefs。
#ifdef内核
允许您在使用类型时进行选择


您应该创建包装函数(可以是内联函数),它调用适当的功能(spinlook或mutex)。实际的实现是根据ifdef编译的。

最好的方法是创建一个IOCTL接口来锁定内核资源。我假设您的内核模块向用户空间公开了一个char驱动程序接口。来自用户空间的IOCTL调用将在调用时设置并重置内核自旋锁。您还可以使用相同的接口检查资源是否被内核锁定

内核自旋锁不适用于用户空间,因为如果使用_irqsave/_irqrestore,它将禁用抢占和IRQ。 抢占或IRQ禁用在用户空间中甚至是不可能的


我认为最好的尝试是pthread\u spinlock。

是否尝试将此结构传递给ioctl