|
大家好!
现在正在做一个通过无线网络进行文件传输方面的项目,想让内核空间的接收函数在后台一直运行,然后数据到来时用netlink通过用户态接收,然后写入文件。
主要问题:如何实现内核空间一个函数在后台一直运行,而又不影响用户态的操作。
下面第一种是我的做法,不过目前看来还不行,第二种还没有实现。
1、在驱动中的ioctl中调用内核空间接收函数receive, 然后在用户空间建立一个守护进程,在守护进程中对ioctl函数进行while(1)无线循环,以实现receive在后台的一直运行。可是发现这样的话从另一方传过来的数据会丢失(在内核空间中直接接收不会发生数据丢失)。这是为什么呢?是不是因为用ioctl调用内核中的函数时耗费的时间太长呢?那如何在用户态中建立的守护进程中实现内核态一个函数的一直在后台运行呢?
2、另外若是不用守护进程 我打算在内核空间中创建一个线程,然后一开始就唤醒这个线程,通过这个线程使内核空间的接收函数一直运行。在内核空间创建一个线程用哪个函数呢?我的内核版本是2.6.24。网上有人说用kernel_thread,也有人说用CreateThread到底是哪个呢?在内核源码中倒没有发现CreateThread呢
下面是我在用户态用于创建守护进程的函数:
// 创建一个守护进程
int daemon(int nochdir, int noclose)
{
unsigned long pid;
int i;
/* 忽略终端邋I/O信号,STOP信号 */
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGHUP,SIG_IGN);
pid = fork();
if(pid > 0)
{
//exit(0);/* 结束父进程,使得子进程成为后台进程 */
return 0;
}else if(pid<0)
{
return -1;
}
/* 使子进程成为这个进程组的首进程 */
setsid();
pid = fork();
if(pid>0)
{
return 0;
}
else if(pid<0)
{
return -1;
}
/* 改变工作目录,使得进程不与任何文件系统联系 */
if (! nochdir)
chdir("/");
/* 关闭所有从父进程继承的不再需要的文件描述符 */
if (! noclose)
{
int fd;
fd = open ("/dev/null", O_RDWR, 0);
if (fd != -1)
{
dup2 (fd, STDIN_FILENO);
dup2 (fd, STDOUT_FILENO);
dup2 (fd, STDERR_FILENO);
if (fd > 2)
close (fd);
}
}
/* 文件屏蔽字 */
umask(0027);
/* 忽略SIGCHLD信号 */
signal(SIGCHLD,SIG_IGN);
while(1)
{
ioctl(fd,1);
}
return 0;
}
各位看看有什么好的建议和方法么?除了上面两种方法是否还有其它的办法可行呢?
|
|