当前位置:  技术问答>linux和unix

linux内核代码 sem.c 中结将结构体视为数组的问题

    来源: 互联网  发布时间:2017-03-07

    本文导语:      在Linux3.0.1的内核代码中:.../ipc/sem.c 的第1246行有如下代码:new->semadj = (short *) &new[1]; 其中: new 的定义为:struct sem_undo  *new; new 通过这条语句申请空间:new = kzalloc(sizeof(struct sem_undo) + sizeof(short)*nsems,...

    在Linux3.0.1的内核代码中:.../ipc/sem.c 的第1246行有如下代码:new->semadj = (short *) &new[1];
其中:
new 的定义为:struct sem_undo  *new;
new 通过这条语句申请空间:new = kzalloc(sizeof(struct sem_undo) + sizeof(short)*nsems, GFP_KERNEL);
其中使用到一些结构体的定义如下:
in : .../ipc/sem.h
/* 
 * Each task has a list of undo requests. They are executed automatically
 * when the process exits.
 */
struct sem_undo {
struct list_head list_proc;        /* per-process list: all undos from one process. */
/* rcu protected */
struct rcu_head  rcu; /* rcu struct for sem_undo() */
struct sem_undo_list *ulp; /* sem_undo_list for the process */
struct list_head          list_id; /* per semaphore array list: all undos for one array */
int semid; /* semaphore set identifier */
short * semadj; /* array of adjustments, one per semaphore */
};

/*
 * sem_undo_list controls shared access to the list of sem_undo structures
 * that may be shared among all a CLONE_SYSVSEM task group.
 */
struct sem_undo_list {
atomic_t refcnt;
spinlock_t lock;
struct list_head list_proc;
};

in : .../include/linux/types.h
struct list_head {
struct list_head *next, *prev;
};

in : .../include/linux/rcupdate.h
/*
 * struct rcu_head - callback structure for use with RCU
 * @next: next update requests in a list
 * @func: actual update function to call after the grace period.
 */
struct rcu_head {
struct rcu_head *next;
void (*func)(struct rcu_head *head);
};

in : .../include/linux/spinlock_types.h

typedef struct spinlock {
union {
struct raw_spinlock rlock;

#ifdef CONFIG_DEBUG_LOCK_ALLOC
# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map))
struct {
u8 __padding[LOCK_PADSIZE];
struct lockdep_map dep_map;
};
#endif
};
} spinlock_t;


    我想问的问题是:语句:new->semadj = (short *) &new[1]; 是什么意思,如何实现赋值的。在new->semadj = (short *) &new[1];  中如何将 new 一个指向结构体的指针与数组联系起来的。
    语句:new->semadj = (short *) &new[1];  在函数: static struct sem_undo *find_alloc_undo(struct ipc_namespace *ns, int semid) 中使用到。
    还请知道的朋友告知。先谢谢了!

|
举个最简单的例子:
你定义一个指针:char *p;
你可以这样用:&p[1],
这里只不过是指向结构体的指针,和指向char类型的指针本质上是一样的,

|
new[1]取的值是new+1,
执行过后new->semadj的值是new[1]的地址。

|
不要说这个例子你不明白,如果真不明白,那就必需看一下c语言的书了。


    
 
 

您可能感兴趣的文章:

  • linux 的shell(bash)中有数组吗?
  • linux c数组问题
  • 请问如何在linux (redhat)下传递一维数组指针?
  • linux下读取文本文件里汉字存到字符数组里
  • 请教如何在qt-linux环境下两个cpp文件中对同一个数组作读写互斥操作?
  • 在shell中使用数组需要什么特殊的条件马? 怎么在有的linux下能够用,在有的linux下就不能能使用?
  • 请问,LINUX的C++中,如何将string类型与char数组一次性互相转换?
  • linux & unix 如何把 long型转化为 字符串数组(用来拼socket报文)?高手请救!!
  • 编程语言 iis7站长之家
  • 奇怪 linux 下 动态创建数组 这样写说结构体的实参类型无效
  • Linux下C语言怎样从键盘读入一个十六进制字符数组
  • 通过实例深入理解linux shell数组
  • linux shell数组深入学习理解
  • linux下怎么样搜索当前目录下的所有MP3文件,并把文件名保存在数组里??????
  • Linux 中字符数组作为全局变量的纠结问题
  • Linux内核中影响tcp三次握手的一些协议配置
  • 我想学习linux桌面编程,那么有没有必要学习linux的内核以及内核的相关编程呢?
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 现有linux内核中共享内存机制如何移植到linux0.11内核中
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • 读懂 Linux 内核代码不难,难的是读懂 Linux 内核代码背后的哲学!
  • linux内核中的likely宏和unlikely宏介绍及用法
  • Linux中内核线程不访问内核态地址空间?
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • linux为什么要升级内核?升级内核有何作用?
  • 请问linux中如何判断内核是否已经启动。(在内核中写程序)
  • 《Linux内核情景分析》值得推荐的内核学习参考两用资料
  • *******是不是对内核模块编程然后再重新编译内核就可以把此模块整合到linux系统中
  • Linux 编译内核之后 没办法选择内核版本
  • 想看linux内核源代码,另外手头上有一本《unix环境高级编程》,需要先把《unix环境高级编程》看完之后再看内核吗?
  • 请问重新编译LINUX内核是否能将没有用的外设的驱动程序删除并减少内核占有内存的资源?请好心人仕指教!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在没有linux的盘,只有DOS启动盘)
  • Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞
  • 如何让win2000和linux共存。我装好WIN2000,再装LINUX7.0,但LILO只能找到LINUX,不能引导WIN2000
  • linux c下利用srand和rand函数生成随机字符串
  • 在windows中的VMware装了个linux,主板有两个串口,能做windows和linux的串口通信测试么,怎么测试这两个串口在linux是有效
  • Linux c++虚函数(virtual function)简单用法示例代码
  • 我们网站的服务器从windows2000迁往linux,ASP程序继续使用,可是我连LINUX的皮毛都不了解,大家告诉我LINUX下怎么建网站??
  • Docker官方镜像将会使用Alpine Linux替换Ubuntu
  • 中文Linux与西文Linus分别哪一个版是权威?I认为是:中科软的白旗Linux与西文的绿帽子Linux!大家的看法呢?
  • Linux下chmod命令详细介绍及用法举例
  • 我重装了winme,却进不了Linux了,而我现在又没有Linux光盘,也没有Linux启动盘,还有没有办法?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3