linux下如何实现两个内核线程之间的通信
并且两个内核线程可能是在不同的机器上 问题点数:20、回复次数:12Top
1 楼tb01412(tb)回复于 2006-04-29 21:01:18 得分 0
不在同一机子上的进程通信只能依靠网络,串口之类,所以你试一下在内核中去封装在C库中的相关操作试一下,也就是说封装一下socket套接字通信的各个API,或者串口操作的API之类Top
2 楼freedomchen()回复于 2006-04-30 09:02:19 得分 0
我对socket理解的不是很深刻。我曾经看到过一篇关于linux内核线程和用户进程间通信的帖子,好像是用netlink实现的,我不太清楚socket,netlink,tcp/ip这三者之间的关系,可否给我科普一下,多谢了Top
3 楼yangxudongseu(贝壳里的涛声)回复于 2006-04-30 16:53:56 得分 0
unix域套接字Top
4 楼john56(John Blanchard)回复于 2006-05-07 17:01:07 得分 0
内核是多线程吗?Top
5 楼shinesi(DaBaiCai)回复于 2006-05-08 19:44:42 得分 0
rpcTop
6 楼yaoyuhang(tom)回复于 2006-05-09 15:04:14 得分 0
不太明白,什么是“内核线程”。帮不了你啦
如果是线程间通信方式很多。
共享内存,管道,socket,信号量等等。Top
7 楼tb01412(tb)回复于 2006-05-09 15:22:28 得分 0
内核线程,你可以将它看成一个普通的进程,只不过它没有单独的进程页表,CR3等,而是共用内核的,并且是工作在内核态,其它情况与一个普通的进程完全一样
一个用户进程可以用什么方式与外部机子通信,就可以在内核线程中用相应方式,不过内核线程由于工作在内核态,所以不能使用C库的东东,这样一来就有了太多限制,比如不能使用封装好的socket通信,不能使用封装好的文件操作函数等,而C库的这些东东都是调用内核的相关系统调用来实现的,所以你完全可以模仿C库的操作,自己来封装这些函数,然后调用,不过这样做非常麻烦,给一个简单的办法:写一个用户进程,然后通过特定的手段与内核线程通信,而在用户进程中才真正与外部机子通信,这样简化了操作,但效率段降低了,内核线程与用户进程通信的手段就很丰富了,比如进程间的任何通信方式都可以用(同样存在封装API的问题),简单一点可以用proc文件系统,信号(内核中向用户进程发信号非常简单)等,如果再做简单一点,就为你的用户进程写一个“驱动”,内核线程与那个驱动交互数据,同是在内核态下,交互数据的方式就有N多种了,看一下LINUX设备驱动程序这本书就明白了,比如可以用内核信号量,锁,原子操作等,应有尽有,而“驱动”与你的那个用户进程交互数据就再简单不过了,用read,write系列函数,这样一来,由内核线程发起操作,首先向通知“驱动”有数据到来,然后向它传递数据,然后“驱动”通知用户进程有数据来,并且将数据交给用户进程,用户进程将读到的数据再通过socket通信向外部机子发出。。。。
这样一来,写代码的难度大大降低,而效率也大大降低了,数据转了一大圈来发出去,如果你想要提高效率的话,直接在内核线程中使用socket通信与外界交互数据,不过代码的难度就上去了Top
8 楼alec626(月吻长河Blog:spaces.msn.com/filebase)回复于 2006-05-14 17:58:58 得分 0
不同的机器上只有使用socket了Top
9 楼zdhzidy(rick)回复于 2006-05-22 14:51:22 得分 0
呵呵,这个问题好像是计算机集群,分布式样操作系统方面的问题了:)和具体使用Linux还是Windows已经没有什么关系了。建议可以看看分布式系统方面的书籍,估计可能有帮助。Top
10 楼bluedreammer(瀟瀟鳥)回复于 2006-05-25 10:30:22 得分 0
netlink
可以google下,网上很多sample的Top
11 楼sycpu()回复于 2006-05-25 13:53:25 得分 0
长见识Top
12 楼ljp940531(ljp)回复于 2006-06-17 13:45:05 得分 0
比如不能使用封装好的socket通信,不能使用封装好的文件操作函数等,而C库的这些东东都是调用内核的相关系统调用来实现的,所以你完全可以模仿C库的操作,自己来封装这些函数,然后调用,不过这样做非常麻烦,给一个简单的办法:写
内核使用socket函数全部加上sys_就可以了,参数都一样,,一样的使用。。。。呵呵Top




