LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 701|回复: 13

请教一个写法:如何定义一个需要运行时限制值的结构?

[复制链接]
发表于 2005-10-9 11:28:38 | 显示全部楼层 |阅读模式
我想要取得运行时的FIFO的一次写值的限制,POSIX定义为_PC_PIPE_BUF,用pathconf函数可取得:
pathconf(pathname, _PC_PIPE_BUF);
我想定义一个结构,此结构希望一次写进FIFO,以便接收方一次读出一个结构,那么此结构的大小只能小于等于_PC_PIPE_BUF的限制值。此结构因为多个函数要用,应定义在文件开头。

这个有办法办到吗?我想了许久,没有办法,请教各位。
发表于 2005-10-9 12:19:09 | 显示全部楼层
关心这个干嘛
发送方按结构发送,接收方按结构读取不就完事了么
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-9 12:31:09 | 显示全部楼层
Post by x11
关心这个干嘛
发送方按结构发送,接收方按结构读取不就完事了么


发送方有多个,接收方只有一个
回复 支持 反对

使用道具 举报

发表于 2005-10-9 14:55:22 | 显示全部楼层
发送前加个锁,发完解锁不行么
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-9 16:04:03 | 显示全部楼层
这样也可以,但我想一次写进会更好,程序也就不需要用锁了

我想弄明白,运行时的限制不能在我们编译时确定,那么应该是不可以定义与这些限制值有关的数据类型了?
回复 支持 反对

使用道具 举报

发表于 2005-10-9 16:32:27 | 显示全部楼层
sorry,打断一下.不太明白你想要做什么,所以导致回帖也看不懂
能否讲清楚一点? 你要限制什么值? 结构的大小? 结构的数目? 还是其他什么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-9 17:31:52 | 显示全部楼层
pathconf(pathname, _PC_PIPE_BUF);
这个函数可帮助我取得系统FIFO的大小,即我一次最多可写进的字节数。
我将要往一个FIFO里写结构,这个结构的大小大于1024个字节,具体多少可能随着要以后结构成员的修改而增加,但就目前的系统而言,它是小于FIFO一次写的值的(这不代表其他的系统也是如此)。
做个比方,假设FIFO的值大小为fifosize,它可由pathconf(pathname, _PC_PIPE_BUF)返回。
我会定义如下结构:
struct myinfo
{
     int len;
     char data[fifosize - sizeof(int)];
}
上面的当然没办法直接实现。
我的意思是这样:我有什么办法保证我一次性写一个结构到FIFO里:
锁是一种办法
另一种办法是如果能先得到运行时的限制值,就能定义我的结构,可我想不出办法。
或者我没想的其他的办法。。。
回复 支持 反对

使用道具 举报

发表于 2005-10-9 20:22:57 | 显示全部楼层
Post by kiron
pathconf(pathname, _PC_PIPE_BUF);
这个函数可帮助我取得系统FIFO的大小,即我一次最多可写进的字节数。
我将要往一个FIFO里写结构,这个结构的大小大于1024个字节,具体多少可能随着要以后结构成员的修改而增加,但就目前的系统而言,它是小于FIFO一次写的值的(这不代表其他的系统也是如此)。
做个比方,假设FIFO的值大小为fifosize,它可由pathconf(pathname, _PC_PIPE_BUF)返回。
我会定义如下结构:
struct myinfo
{
     int len;
     char data[fifosize - sizeof(int)];
}
上面的当然没办法直接实现。
我的意思是这样:我有什么办法保证我一次性写一个结构到FIFO里:
锁是一种办法
另一种办法是如果能先得到运行时的限制值,就能定义我的结构,可我想不出办法。
或者我没想的其他的办法。。。

结构的成员data改用指针,然后动态分配不行吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-9 21:12:00 | 显示全部楼层
好吧,用动态分配
回复 支持 反对

使用道具 举报

发表于 2005-10-9 23:17:02 | 显示全部楼层
Post by kiron
pathconf(pathname, _PC_PIPE_BUF);
这个函数可帮助我取得系统FIFO的大小,即我一次最多可写进的字节数。
我将要往一个FIFO里写结构,这个结构的大小大于1024个字节,具体多少可能随着要以后结构成员的修改而增加,但就目前的系统而言,它是小于FIFO一次写的值的(这不代表其他的系统也是如此)。
做个比方,假设FIFO的值大小为fifosize,它可由pathconf(pathname, _PC_PIPE_BUF)返回。
我会定义如下结构:
struct myinfo
{
     int len;
     char data[fifosize - sizeof(int)];
}
上面的当然没办法直接实现。
我的意思是这样:我有什么办法保证我一次性写一个结构到FIFO里:
锁是一种办法
另一种办法是如果能先得到运行时的限制值,就能定义我的结构,可我想不出办法。
或者我没想的其他的办法。。。

有点不太明白, 你假设FIFO的大小为fifosize,而你的结构的size却又刚刚和fifosize一样大,一次就把BUF填满了?没有缓冲作用啊,如果BUF原来还有数据等待处理的,那不是被覆盖掉了?我猜fifosize应该是当时的空闲size吧?
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表