|
|
[code:1:2bb9bc8b7c]
struct proto_ops unix_stream_ops = {
family: PF_UNIX,
release: unix_release,
bind: unix_bind,
connect: unix_stream_connect,
socketpair: unix_socketpair,
accept: unix_accept,
getname: unix_getname,
poll: unix_poll,
ioctl: unix_ioctl,
listen: unix_listen,
shutdown: unix_shutdown,
setsockopt: sock_no_setsockopt,
getsockopt: sock_no_getsockopt,
sendmsg: unix_stream_sendmsg,
recvmsg: unix_stream_recvmsg,
mmap: sock_no_mmap,
sendpage: sock_no_sendpage,
};
struct proto_ops unix_dgram_ops = {
family: PF_UNIX,
release: unix_release,
bind: unix_bind,
connect: unix_dgram_connect,
socketpair: unix_socketpair,
accept: sock_no_accept,
getname: unix_getname,
poll: datagram_poll,
ioctl: unix_ioctl,
listen: sock_no_listen,
shutdown: unix_shutdown,
setsockopt: sock_no_setsockopt,
getsockopt: sock_no_getsockopt,
sendmsg: unix_dgram_sendmsg,
recvmsg: unix_dgram_recvmsg,
mmap: sock_no_mmap,
sendpage: sock_no_sendpage,
};
[/code:1:2bb9bc8b7c]
出自linux内核代码,有关socket的内容/usr/src/linux-2.4/net/unix/af_unix.c
不知道这里的“:”是什么意思,以及为什么后面用“,”.
| 无双 回复于:2003-02-28 09:19:53
| 是不是表示是位数
c语言中一个结构中每个字段占一位是什么写了我忘记了
| | 无双 回复于:2003-02-28 09:25:30
| 与位结构的表示方法不一样
楼主还是自己写个代码看看
看它的sizeof是多少
以下是位结构的定义
二、位结构
位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构
比按位运算符更加方便。
位结构定义的一般形式为:
[code:1:9cd329a911]
struct位结构名{
数据类型 变量名: 整型常数;
数据类型 变量名: 整型常数;
} 位结构变量;
[/code:1:9cd329a911]
其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整
数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。
变量名是选择项, 可以不命名, 这样规定是为了排列需要。
例如: 下面定义了一个位结构。
[code:1:9cd329a911]
struct{
unsigned incon: 8; /*incon占用低字节的0~7共8位*/
unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/
unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/
unsigned blink: 1; /*blink占用高字节的第7位*/
}ch;
[/code:1:9cd329a911]
位结构成员的访问与结构成员的访问相同。
例如: 访问上例位结构中的bgcolor成员可写成:
ch.bgcolor
注意:
1. 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当成员长
度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,
如果是指针, 其成员访问方式同结构指针。
3. 位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字
节。
4. 位结构成员可以与其它结构成员一起使用。
例如:
[code:1:9cd329a911]
struct info{
char name[8];
int age;
struct addr address;
float pay;
unsigned state: 1;
unsigned pay: 1;
}workers;'
[/code:1:9cd329a911]
上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结
构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工
人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。
[/code]
| | flw 回复于:2003-02-28 09:25:35
| (本次发言由于存在错误,所以已经作废)
| | menp9999 回复于:2003-02-28 09:34:58
| [quote:1a5eeccd38="bombbaby"]出自linux内核代码,有关socket的内容/usr/src/linux-2.4/net/unix/af_unix.c
不知道这里的“:”是什么意思,以及为什么后面用“,”.[/quote:1a5eeccd38]
这是初始话,实际上是赋值.
| | bombbaby 回复于:2003-02-28 09:37:01
| [quote:700359a4f0="flw"]这是“位域”,学过 C 的都应该知道。[/quote:700359a4f0]
请教一下,到底是什么意思?
| | 无双 回复于:2003-02-28 09:37:02
| 对了
看的时候没有看到是定义变量
以为是定义结构呢
| | menp9999 回复于:2003-02-28 09:37:52
| [quote:c810efa227="bombbaby"]出自linux内核代码,有关socket的内容/usr/src/linux-2.4/net/unix/af_unix.c
不知道这里的“:”是什么意思,以及为什么后面用“,”.[/quote:c810efa227]
不是很明显么?
proto_ops 是数据类型,
unix_stream_ops 这个结构是变量.
在后面的就是为结构的成员进行赋值.GNU/C的扩充用法.
这样的例子在LINUX内核比比皆是.
| | bombbaby 回复于:2003-02-28 09:54:17
| 收到,谢谢楼上的。开始还以为事定义结构呢! ops: ops: ops:
| | menp9999 回复于:2003-02-28 14:39:29
| [quote:6df8a4de54="bombbaby"]不过还有个问题,就是为什么最后也有一个“,”。
后面的应该是一个函数,那么是不是就是说前面的等价于后面的函数?[/quote:6df8a4de54]
不是,前面的只是个指针,指针的内容是用来存储后面的涵数的地址的.其实前面的并不是涵数.
你说的最后要个.的问题,我确实回答不出来,也许为了是GNU/C的语法定义规则有规律简单一点的缘故吧,每一项都一样.
| | bombbaby 回复于:2003-02-28 14:14:10
| 不过还有个问题,就是为什么最后也有一个“,”。
后面的应该是一个函数,那么是不是就是说前面的等价于后面的函数?
| | zhxlanjuan 回复于:2003-03-01 14:56:15
| 关于最后那一个,的确是为了规律性的作用,因为这样就使结构体很有规律,方便编译器的编译,特别是当一个结构体很大的时候,这样做比较有用,c陷阱与缺陷提到了这一点;
在多的我也不知道了^_^
| | 无双 回复于:2003-02-28 16:35:52
| 这是不是标准C中的语法
还是只是GCC的扩展
如果是GCC扩展的话
可能表示其它元素不指定的意思
| | menp9999 回复于:2003-02-28 16:41:02
| [quote:725d55da83="无双"]这是不是标准C中的语法
还是只是GCC的扩展
如果是GCC扩展的话
可能表示其它元素不指定的意思[/quote:725d55da83]
其他元素默认是NULL.
这样的结构里的成员并不是每个都要用到的.
| | menp9999 回复于:2003-03-01 11:12:07
| [quote:cfc6b0d821="flw"](本次发言由于存在错误,所以已经作废)[/quote:cfc6b0d821]
你这么做是干什么?谁没有错误呀?高手和低手的差别不过是谁的错误多一点谁的错误少一点而已.这么搞的以后大家都不敢发言了.我个人以为:无论对错,问问题还是答问题都是都我的水平提高有极大的帮助.
| | menp9999 回复于:2003-03-01 16:03:38
| [quote:5df6c7b123="zhxlanjuan"]关于最后那一个,的确是为了规律性的作用,因为这样就使结构体很有规律,方便编译器的编译,特别是当一个结构体很大的时候,这样做比较有用,c陷阱与缺陷提到了这一点;
在多的我也不知道了^_^[/quote:5df6c7b123]
哈哈,我又猜对了.我是从语法规则上来推测的.譬如要是不,号,语法规则肯定要比加,号复杂.
| | 雷斯林 回复于:2003-03-01 19:47:19
| 冒号前的表示结构的成员名,
冒号后的表示给该成员所赋的值,
最后的逗号表示后面还有几个成员没有赋明确的值(将被初始化为0)
| | menp9999 回复于:2003-03-02 15:59:18
| [quote:7ea438851e="雷斯林"]冒号前的表示结构的成员名,
冒号后的表示给该成员所赋的值,
最后的逗号表示后面还有几个成员没有赋明确的值(将被初始化为0)[/quote:7ea438851e]
最后的豆号是这个意思?不可能,因为有可能是中间的几个成员不被副值呢?
典型的以FILE_OPRETOR结构为例子,并不是只是后面的几个成员不被副值呀.
| | 雷斯林 回复于:2003-03-03 09:15:00
| 中间的成员可以省略,是因为对每一个我们要初始化的成员我们都把它的名字给写了出来,编译器自然可以知道如何去对应。
| | menp9999 回复于:2003-03-03 10:25:06
| [quote:cfd144f333="雷斯林"]中间的成员可以省略,是因为对每一个我们要初始化的成员我们都把它的名字给写了出来,编译器自然可以知道如何去对应。[/quote:cfd144f333]
从语法上来讲,加不加逗号都不改变本来的语义,所以不加也是可以的,所以我推测的是为了使语法规则简单而加一个逗号.安照你的意思,不加逗号编译器就不能识别,其实不加逗号,只要修改语法规则的话,照样可以识别,支部语法规则要复杂一点而已.
| | 雷斯林 回复于:2003-03-03 12:28:17
| 同意menp9999的看法,不过我也没说不加逗号编译器就报错啊
| | menp9999 回复于:2003-03-03 12:31:57
| [quote:6350e1c34c="雷斯林"]同意menp9999的看法,不过我也没说不加逗号编译器就报错啊[/quote:6350e1c34c]
编译器应该是报错的吧?如果不加的话.
| | 雷斯林 回复于:2003-03-04 19:12:39
| 我试过了,最后一个逗号可以不加,中间的必须加。
我用的IDE是Tornado
| | menp9999 回复于:2003-03-05 08:56:01
| [quote:a04df868fe="雷斯林"]我试过了,最后一个逗号可以不加,中间的必须加。
我用的IDE是Tornado[/quote:a04df868fe]
不足以证明,如果你想要试试的话,你可以直接在LINUX的内核的代码里试一下.你说的环境我没有见过,但是我个人是这样推测的:他能识别不加最后一个逗号的文法.或者说他是另外加了一些语法规则.因为从语义上说,结合下文是不存在二义性的,但是你肯定要多加一条语法规则.
另外请你把在LINUX下的结果写出来,我编译碰到了空难.好麻烦的.
| |
|