Chinaunix首页 | 论坛 | 博客
  • 博客访问: 235596
  • 博文数量: 149
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1127
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-26 15:53
个人简介

喷泉之所以漂亮,是因为她有压力;瀑布之所以壮观,是因为她没退路。

文章分类

全部博文(149)

文章存档

2016年(25)

2015年(124)

我的朋友

分类: LINUX

2015-04-27 15:25:52

   在Linux2.6版本的内核中,我们经常可以看到下面的结构体的定义和初始化。这在以前的C语言书中是极少见到的。下面的一个结构体来自到Linux内核中的一部分。在这个结构体中我们可以看到有普通的整型变量,也有函数的指针。

struct net_proto_family {
    int        family;
    int        (*create)(struct net *net, struct socket *sock,
                 int protocol, int kern);
    struct module    *owner;
};

  而在内核中可以使用下面的方法进行初始化。

static const struct net_proto_family netlink_family_ops = {
    .family = PF_NETLINK,
    .create = netlink_create,
    .owner    = THIS_MODULE,    /* for consistency 8) */
};

下面是使用上面的结构体的一个小程序,其中还有结构体中的另外一种应用:

#include <stdio.h>
#define PF_ID 10

enum
{
    ID1 = 10,
    ID2,
    ID3,
};

char *message = "message";
int create(int fd,char *name)
{
    if(fd == 10)
      {
        printf ("I am create fd = %d,name = %s\n",fd,name);
     }
    return 1;
}

int output (int fd,char *name)
{
     printf("I am output fd =%d,name = %s\n",fd,name);
     return 1;
}

int output_2 (int fd,char *name)
{
    printf("I am output_2 fd = %d,name = %s\n",fd,name);
}

struct test_1
{
    int (*output)(int fd,char *name);
};

struct test
{
    int id;
    char name[50];
    int (*print)(int fd,char *name);
};

static struct test des ={

    .id= PF_ID,
    .name ="frank",
    .print = create,
};

struct test_1 table[] = {
     [ID1] = {.output = output},
        [ID2] = {.output = output_2},
};


int main()
{
    printf("des.PF_ID=%d\n",des.id);
    printf("des.message= %s\n",des.name);
    des.print(PF_ID,message);
    table[ID2].output(PF_ID,"table ID2");
    table[ID1].output(PF_ID,"table ID1");
}

这里有一篇分析Linux内核这种数据结构比较详细的文章。
http://blog.csdn.net/mociml/archive/2009/08/13/4443280.aspx

阅读(474) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~