我在 js-ctypes 中的实现中发现了问题fcntl
。我使用了错误的常量值。
- 尽管我看到每个地方都有不同,例如:
这些家伙分别获得了 1 2 3 rdlck
、wrlck
和unlck
。
- 然而,当我运行此 C 代码来找出 ubuntu 上的常量时,它告诉我它们是 0、1 和 2:
答案1
我想说这些常量值是 Linux 特有的,而不是 Ubuntu 特有的。
在您的 C 文件中,您获取的fcntl.h
内容/usr/include/fcntl.h
包含:
/* Get the definitions of O_*, F_*, FD_*: all the
numbers and flag bits for `open', `fcntl', et al. */
#include <bits/fcntl.h>
你/usr/include/<your_arch>/bits/fcntl.h
可以看到以下代码:
/* Include generic Linux declarations. */
#include <bits/fcntl-linux.h>
最后此/usr/include/<your_arch>/bits/fcntl-linux.h
文件定义这些值如下:
#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
要确认它不是 Ubuntu 特有的,你可以检查libc 源代码, 他们是一样的。
答案2
这价值manpage
此类常量始终是实现定义的,除非标准指定了值。如果直接使用值而不是名称,那只会自找麻烦。fcntl
提到了价值观,所以不做任何假设。