Linux中国  设为主页
 收藏本站
 
当前位置: > 首页 ->Linux技术 ->内核研究 ->Relay:一种高效的数据传输技术
  相关分类: 
入门与提高
系统管理
网络应用
嵌入式系统
内核研究
服务器相关
发行版专区
Linux程序设计
Linux安全
BSD相关
桌面应用
  站内搜索: 
热门文章排行
热门文章排行 一次即大功告成 Linux内核升级全过程(04-19)
使用 Linux 系统调用的内核命令 (04-22)
推荐:Linux用户态与内核态的交互(04-11)
Linux内核配置选项 (04-22)
Linux 2.6 内核的 Initrd 机制解析(04-11)
精采文章排行
精采文章排行 使用 Linux 系统调用的内核命令 (04-22)
Linux 和对称多处理 (04-22)
Relay:一种高效的数据传输技术 (04-22)
使用 SystemTap 调试内核 (04-22)
配置FreeBSD内核 (04-22)
  ·Linux 和对称多处理 ·Relay:一种高效的数据传输技术 ·使用 SystemTap 调试内核 ·配置FreeBSD内核 ·在FreeBSD4.x中制作启动菜单 ·制作软盘上运行的FreeBSD系统 ·FreeBSD光盘运行版的制作过程 ·制作RAMDISK in KERNEL的NetBSD ·制作RAMDISK in KERNEL的OpenBSD

Relay:一种高效的数据传输技术

作者:桂剑    来源:IBM DW中国   点击:   日期:2007-04-22 [收藏] [投稿]

  IE是否经常中毒?推荐您

  • relay_reserve() - 在relay通道中保留一块连续的区域来留给未来的写入操作。这通常用于那些希望直接写入到relay缓冲区的用户。考虑到性能或者其它因素,这些用户不希望先把数据写到一个临时缓冲区中,然后再通过relay_write()进行写入。
  • Relay的例子

    我们用一个最简单的例子来介绍怎么使用Relay。这个例子由两部分组成:一部分是位于内核空间将数据写入relay文件的程序,使用时需要作为一个内核模块被加载;另一部分是位于用户空间从relay文件中读取数据的程序,使用时作为普通用户态程序运行。

    内核空间的程序主要操作是:

    • 加载模块时,打开一个relay通道,并且往打开的relay通道中写入消息;
    • 卸载模块时,关闭relay通道。

    程序内容:


    /*
     * hello-mod.c
     * a kernel-space client example of relayfs filesystem
     */
    #include <linux/module.h>
    #include <linux/relayfs_fs.h>
    static struct rchan *hello_rchan;
    int init_module(void)
    {
            const char *msg="Hello world\n";
            hello_rchan = relay_open("cpu", NULL, 8192, 2, NULL);
            if(!hello_rchan){
                    printk("relay_open() failed.\n");
                    return -ENOMEM;
            }
            relay_write(hello_rchan, msg, strlen(msg));
            return 0;
    }
    void cleanup_module(void)
    {
            if(hello_rchan) {
                    relay_close(hello_rchan);
                    hello_rchan = NULL;
            }
            return;
    }
    MODULE_LICENSE ("GPL");
    MODULE_DESCRIPTION ("Simple example of Relay");
    

    用户空间的函数主要操作是:

    • 如果relayfs文件系统还没有被mount,则将其mount到目录/mnt/relay上;
    • 遍历每一个CPU对应的缓冲文件
      • 打开文件
      • 读取所有文件内容
      • 关闭文件
    • 最后,umount掉relay文件系统。

    程序内容:


    /*
     * audience.c
     * a user-space client example of relayfs filesystem
     */
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/mount.h>
    #include <fcntl.h>
    #include <sched.h>
    #include <errno.h>
    #include <stdio.h>
    #define MAX_BUFLEN 256
    const char filename_base[]="/mnt/relay/cpu";
    // implement your own get_cputotal() before compilation
    static int get_cputotal(void);
    int main(void)
    {
            char filename[128]={0};
            char buf[MAX_BUFLEN];
            int fd, c, i, bytesread, cputotal = 0;
            if(mount("relayfs", "/mnt/relay", "relayfs", 0, NULL)
                            && (errno != EBUSY)) {
                    printf("mount() failed: %s\n", strerror(errno));
                    return 1;
            }
            cputotal = get_cputotal();
            if(cputotal <= 0) {
                    printf("invalid cputotal value: %d\n", cputotal);
                    return 1;
            }
            for(i=0; i<cputotal; i++) {
                    // open per-cpu file
                    sprintf(filename, "%s%d", filename_base, i);
                    fd = open(filename, O_RDONLY);
                    if (fd < 0) {
                            printf("fopen() failed: %s\n", strerror(errno));
                            return 1;
                    }
                    // read per-cpu file
                    bytesread = read(fd, buf, MAX_BUFLEN);
                    while(bytesread > 0) {
                            buf[bytesread] = '\0';
                            puts(buf);
                            bytesread = read(fd, buf, MAX_BUFLEN);
                    };
                    // close per-cpu file
                    if(fd > 0) {
                            close(fd);
                            fd = 0;
                    }
            }
            if(umount("/mnt/relay") && (errno != EINVAL)) {
                    printf("umount() failed: %s\n", strerror(errno));
                    return 1;
            }
            return 0;
    }
    

    上面这个例子给出了使用relay的一个最简单的情形,并没有实际用处,但是形象描述了从用户空间和内核空间两个方面使用relay的基本流程。实际应用中对relay的使用当然要比这复杂得多。更多的例子请参见relay的主页。

    原文链接:http://www.ibm.com/developerworks/cn/linux/l-cn-relay/index.html



     如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<

    上一页 1 2下一页

    上一篇:使用 SystemTap 调试内核   下一篇:Linux 和对称多处理
    文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论

       相关文章:
    ·使用 Linux 系统调用的内核命令

       文章评论:(1条)
      
     请留名: 匿名评论   点击查看所有评论 论坛讨论
     

     声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。