- 主题:发现一个rust libc crate的问题
libc::flock 的l_type字段是 c_short。在mac os中libc::F_WRLCK 定义是c_short。可以填写到上面的字段中。
但是在linux中,libc::F_WRLCK 被定义成 c_int,如果要填写到上面的字段中,就会导致类型不匹配。这是不是libc这个库没弄好?
--
FROM 111.196.134.*
libc不同平台不同实现
如果是要通过编译,简单处理一下是 xxx.l_type = libc::F_WRLCK as _
【 在 chunhui 的大作中提到: 】
: libc::flock 的l_type字段是 c_short。在mac os中libc::F_WRLCK 定义是c_short。可以填写到上面的字段中。
: 但是在linux中,libc::F_WRLCK 被定义成 c_int,如果要填写到上面的字段中,就会导致类型不匹配。这是不是libc这个库没弄好?
--
FROM 222.65.123.*
这个还需要判断是什么平台。如果是mac bsd可以直接用,如果是linux需要 as 转一下。
这个问题rust的libc库内部貌似无法解决?
【 在 RunningOn 的大作中提到: 】
: libc不同平台不同实现
: 如果是要通过编译,简单处理一下是 xxx.l_type = libc::F_WRLCK as _
--
FROM 111.196.134.*
mac 和 bsd 也可以用 as _ 转,代码是一样的,不会报错
rust libc库只是如实把C libc库转到rust,它本来就是各平台会有不同。
【 在 chunhui 的大作中提到: 】
: 这个还需要判断是什么平台。如果是mac bsd可以直接用,如果是linux需要 as 转一下。
: 这个问题rust的libc库内部貌似无法解决?
--
FROM 222.65.123.*
噢,你的意思是不加os判断,直接就写 as u16。可能在mac上本来就是u16,再写成 as u16。会有警告提示。不过这是最简单办法了。我回头试试。如果有警告可以加个关闭警告的标记。总比区分os简单。
【 在 RunningOn 的大作中提到: 】
: mac 和 bsd 也可以用 as _ 转,代码是一样的,不会报错
: rust libc库只是如实把C libc库转到rust,它本来就是各平台会有不同。
--
FROM 111.196.134.*
楼主说的对,感觉还是有问题,各平台不同是正确的,但Linux上应该是c_short,在li
nux的头文件里:
#ifndef F_RDLCK
/* For posix fcntl() and `l_type' field of a `struct flock' for lockf(). */
# define F_RDLCK 0 /* Read lock. */
# define F_WRLCK 1 /* Write lock. */
# define F_UNLCK 2 /* Remove lock. */
#endif
而fcntl手册里说它们是给l_type使用的,它是一个short:
short l_type; /* Type of lock: F_RDLCK,
F_WRLCK, F_UNLCK */
所以,Linux平台应该是c_short而不是c_int才对
: mac 和 bsd 也可以用 as _ 转,代码是一样的,不会报错
: rust libc库只是如实把C libc库转到rust,它本来就是各平台会有不同。
--
修改:gameplayer FROM 222.128.5.*
FROM 222.128.5.*
可以给libc提个bug,l_type基本都是c_short,只有32位hurd是c_int,而F_WRLCK这三
个常量大部分定义都是c_int,这不对,它们应该保持一致,修改一下比较好
【 在 chunhui 的大作中提到: 】
: libc::flock 的l_type字段是 c_short。在mac os中libc::F_WRLCK 定义是c_short。可以填写到上面的字段中。
: 但是在linux中,libc::F_WRLCK 被定义成 c_int,如果要填写到上面的字段中,就会导致类型不匹配。这是不是libc这个库没弄好?
--
FROM 222.128.5.*
不是,是写 as _ , 后面是下划线,编译器会自动推定类型。
【 在 chunhui 的大作中提到: 】
: 噢,你的意思是不加os判断,直接就写 as u16。可能在mac上本来就是u16,再写成 as u16。会有警告提示。不过这是最简单办法了。我回头试试。如果有警告可以加个关闭警告的标记。总比区分os简单。
--
FROM 222.65.123.*
在glibc中,宏定义没有类型,把F_RDLCK传给l_type的时候,就直接当成short了。但是在r
ust中,有类型。所以报错。
不知道这个宏是否还有其他地方用,如果其他地方,比如有个xx_type 定义是int。但也需要填入这个F_WRLCK宏。那如果直接定义成short,又冲突了。。。
应该在哪儿提bug啊?可能这还不算是bug,因为libc crate,是如实反应的glibc?
【 在 gameplayer 的大作中提到: 】
: 可以给libc提个bug,l_type基本都是c_short,只有32位hurd是c_int,而F_WRLCK这三
: 个常量大部分定义都是c_int,这不对,它们应该保持一致,修改一下比较好
--
FROM 111.196.134.*
噢。这个用法我还真不知道。那我试试。
【 在 RunningOn 的大作中提到: 】
: 不是,是写 as _ , 后面是下划线,编译器会自动推定类型。
--
FROM 111.196.134.*