回答
我建议你上几种方式在内核推迟工作(因为它是你到底需要什么)挖。
这是最接近的你明确要求的解决方案是使用
,可能适合你的问题是使用的工作队列的其他可能的方式。有了这个,你必须首先宣布你想推迟的工作。
- 在堆栈:
DECLARE_WORK(name, void (*func)(void*), void *data);
会自动初始化堆栈将与data
被喂func
工人功能上struct work_struct
运行时,您可以用两个预处理器宏取决于您希望您的工作结构分配做到这一点。 - 堆上:假设你已经分配了一个
struct work_struct
对象,你只是想用你的函数和合适的数据初始化它。那么你应该使用INIT_WORK(struct work_struct *work, void (*func)(void*), void *data);
当你想运行你的任务,你必须时间表它,它就会出现在工作者线程相关工作运行工程的名单上队列。如果你只是想使用默认的工作队列,你必须使用以下两种功能之一:
int schedule_work(struct work_struct *work);
int schedule_delayed_work(struct work_struct *work, unsigned long delay);
delay
在的jiffies(你的处理器的时钟蜱)表示。
如果您创建了自定义工作队列,则必须使用其他功能。但首先,让我们看看如何创建自己的工作队列对象。要做到这一点,你只需要拨打:
struct workqueue_struct create_workqueue(const char *name);
一旦这样做,你可以添加待审批工作,以使用类似于之前显示的两个功能的队列。
int queue_work(struct workqueue_struct *wq, struct work_struct *work);
int queue_delayed_work(struct workqueue_struct *wq,
struct work_struct *work, unsigned long delay);
如果你想挂起的作品列表被刷新,只需使用:
/* On the default work queue */
void flush_scheduled_work(void);
/* On a dynamically created work queue */
void flush_workqueue(struct workqueue_struct *wq);
注意,这会注意到刷新延迟的工作,还没有准备好去...如果你想取消延迟工作,你将不得不使用int cancel_delayed_work(struct work_struct *work);
。 的工作者线程如下行为:
- 虽然跑的作品列表是非空:
- 它抓住了工作在列表(
struct work_struct
对象)的负责人。 - 它运行与对象
data
饲喂对象func
,如果工作结构存储在struct work_struct *work
它将执行(*work->func)(work->data);
- 它抓住了工作在列表(
- 如果计划作品列表是空的,它进入睡眠状态。当你安排工作时它会被唤醒。
显然,当您需要随时准备运行后台任务时,第二个选项不适用。在这种情况下,标准kthread
就是你需要的。看到我链接的手册页,它解释了如何使用它很清楚。
要解决您的问题,您可以运行两个线程。发件人和收件人。接收器接收传入数据包(这可能比看起来更复杂,您可能不得不处理irq handlers
这样做......)。因此,kthread_create
选项对您有好处。另一方面,当你得到要发送的数据(对于发送者)或者刚接收到适当的数据包(接收者)时,你可以有一个下半部分,它将被安排并运行ONCE。在这种情况下,您可能必须使用工作队列和tasklets(或softirqs)。因为我目前没有时间,所以我稍后编辑我的帖子来描述这些野兽。
非常感谢您的回答。我正在寻找类似khtread的东西......但我也会考虑到工作队列和阅读,也许workqueue可以解决我的问题比Kthread ...再次非常感谢你的答复..... –
我目前无法让我的答案更好,但我会尽快编辑它。注意要真正理解不同解决方案之间的差异。 – Rerito
- 1. Linux内核编程
- 2. Linux内核版本编号
- 3. 关于内核3.x上的设备驱动程序编程的文档
- 4. 关于Linux内核
- 5. linux - 内核线程抢占
- 6. Linux内核线程问题
- 7. CentOS的Linux内核版本
- 8. Linux内核模块编程
- 9. Linux内核模块中的内核线程之间的通信
- 10. Linux内核版本号?
- 11. Linux内核线程 - 调度程序
- 12. Linux中的内核线程退出
- 13. linux内核的list.h线程安全吗?
- 14. 关于linux内核模块
- 15. 内核编程
- 16. Docker可以部署在Linux内核的2.6.x版本上吗?
- 17. 线程vs内核
- 18. 线程和内核
- 19. Linux内核编程:“无法处理内核NULL指针引用”
- 20. 关于Linux内核内部问题
- 21. 如何确定内核对象文件编译的Linux内核版本?
- 22. 编译linux内核
- 23. 编译Linux内核
- 24. NT内核编程
- 25. Linux内核模块编程:makefile
- 26. 从哪里开始linux内核编程?
- 27. Linux内核模块编程Makefile错误
- 28. Linux内核模块编程Makefile
- 29. 如何在内核模块中打印linux内核版本号
- 30. 在运行时从linux内核模块获取内核版本
Eh?你不需要在内核中编程来使用[pthreads](https://computing.llnl.gov/tutorials/pthreads/);内核线程非常复杂,你可能应该避免它们。转到http://kernelnewbies.org/ –
@BasileStarynkevitch我正在开发项目,我需要同时发送和接收数据包,并且必须在内核级别完成。这就是我在内核级寻找线程的原因。我在内核新手上发现了这个[线程](http://kernelnewbies.org/Simple_UDP_Server?highlight=%28thread%29)的例子,但它是针对较老的内核版本的。我正在寻找更新的内核的更多例子...... –