2013-10-17 66 views
1

我想知道哪里可以找到关于内核3.x的线程上的Linux内核编程的好教程或示例?关于内核版本3.x的线程上的Linux内核编程

任何帮助,将不胜感激.....

+2

Eh?你不需要在内核中编程来使用[pthreads](https://computing.llnl.gov/tutorials/pthreads/);内核线程非常复杂,你可能应该避免它们。转到http://kernelnewbies.org/ –

+0

@BasileStarynkevitch我正在开发项目,我需要同时发送和接收数据包,并且必须在内核级别完成。这就是我在内核级寻找线程的原因。我在内核新手上发现了这个[线程](http://kernelnewbies.org/Simple_UDP_Server?highlight=%28thread%29)的例子,但它是针对较老的内核版本的。我正在寻找更新的内核的更多例子...... –

回答

1

我建议你上几种方式在内核推迟工作(因为它是你到底需要什么)挖。

这是最接近的你明确要求的解决方案是使用

struct task_struct * kthread_create(int (*threadfn) (void *data), void * data, const char namefmt[], ...);

,可能适合你的问题是使用的工作队列的其他可能的方式。有了这个,你必须首先宣布你想推迟的工作。

  • 在堆栈: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);。 的工作者线程如下行为:

  1. 虽然跑的作品列表是非空:
    1. 它抓住了工作在列表(struct work_struct对象)的负责人。
    2. 它运行与对象data饲喂对象func,如果工作结构存储在struct work_struct *work它将执行(*work->func)(work->data);
  2. 如果计划作品列表是空的,它进入睡眠状态。当你安排工作时它会被唤醒。

显然,当您需要随时准备运行后台任务时,第二个选项不适用。在这种情况下,标准kthread就是你需要的。看到我链接的手册页,它解释了如何使用它很清楚。

要解决您的问题,您可以运行两个线程。发件人和收件人。接收器接收传入数据包(这可能比看起来更复杂,您可能不得不处理irq handlers这样做......)。因此,kthread_create选项对您有好处。另一方面,当你得到要发送的数据(对于发送者)或者刚接收到适当的数据包(接收者)时,你可以有一个下半部分,它将被安排并运行ONCE。在这种情况下,您可能必须使用工作队列tasklets(或softirqs)。因为我目前没有时间,所以我稍后编辑我的帖子来描述这些野兽。

+0

非常感谢您的回答。我正在寻找类似khtread的东西......但我也会考虑到工作队列和阅读,也许workqueue可以解决我的问题比Kthread ...再次非常感谢你的答复..... –

+0

我目前无法让我的答案更好,但我会尽快编辑它。注意要真正理解不同解决方案之间的差异。 – Rerito