3312|7

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

如何实现内核空间一个函数在后台一直运行! [复制链接]

大家好!
现在正在做一个通过无线网络进行文件传输方面的项目,想让内核空间的接收函数在后台一直运行,然后数据到来时用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;
}

各位看看有什么好的建议和方法么?除了上面两种方法是否还有其它的办法可行呢?

最新回复

呵呵,最近常混vc和硬件区,搞错了  详情 回复 发表于 2009-1-15 23:09
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
PsCreateSystemThread
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这个贴子怎么这么冷啊!!!!
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
我在我的内核源码搜了一下,没有发现PsCreateSystemThread的使用呢?
而且我在网上搜了一下,好像PsCreateSystemThread不是在Linux下用的吧?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 
这个函数是Windows系统中的,Linux不了解。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 2 楼 xiabeizi 的回复:
这个贴子怎么这么冷啊!!!!


这是vc区,你应该发到liunx区

看了你说的,不明白你为什么要在内核空间实现
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
这应该就是驱动开发/核心开发区啊!
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 6 楼 xiabeizi 的回复:
这应该就是驱动开发/核心开发区啊!


呵呵,最近常混vc和硬件区,搞错了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表