如何解决为什么我找不到 ioctl() 的文档?
我正在搜索 ioctl()
的文档,我在 POSIX 标准中找到了一些东西:
https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/
但看起来这只是一小部分...
例如,我找不到有关此 TIocgWINSZ
的任何信息,显然人们正在使用:
Getting terminal width in C?
在我的 C 程序中只包含这个头文件 sys/ioctl.h
,我猜在我的 Debian 机器上这是实际包含的文件:
┌───┐
│ $ │ ziga > ziga--workstation > usr
└─┬─┘
└─> cat /usr/include/linux/ioctl.h
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _LINUX_IOCTL_H
#define _LINUX_IOCTL_H
#include <asm/ioctl.h>
现在我尝试找到包含的标头 asm/ioctl.h
并且我再次猜测就是这样:
┌───┐
│ $ │ ziga > ziga--workstation > usr
└─┬─┘
└─> cat /usr/include/asm-generic/ioctl.h
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _ASM_GENERIC_IOCTL_H
#define _ASM_GENERIC_IOCTL_H
/* ioctl command encoding: 32 bits total,command in lower 16 bits,* size of the parameter structure in the lower 14 bits of the
* upper 16 bits.
* Encoding the size of the parameter structure in the ioctl request
* is useful for catching programs compiled with old versions
* and to avoid overwriting user space outside the user buffer area.
* The highest 2 bits are reserved for indicating the ``access mode''.
* NOTE: This limits the max parameter size to 16kB -1 !
*/
/*
* The following is for compatibility across the varIoUs Linux
* platforms. The generic ioctl numbering scheme doesn't really enforce
* a type field. De facto,however,the top 8 bits of the lower 16
* bits are indeed used as a type field,so we might just as well make
* this explicit here. Please be sure to use the decoding macros
* below from Now on.
*/
#define _IOC_NRBITS 8
#define _IOC_TYPEBITS 8
/*
* Let any architecture override either of the following before
* including this file.
*/
#ifndef _IOC_SIZEBITS
# define _IOC_SIZEBITS 14
#endif
#ifndef _IOC_DIRBITS
# define _IOC_DIRBITS 2
#endif
#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
#define _IOC_NRSHIFT 0
#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
#define _IOC_DirsHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
/*
* Direction bits,which any architecture can choose to override
* before including this file.
*
* NOTE: _IOC_WRITE means userland is writing and kernel is
* reading. _IOC_READ means userland is reading and kernel is writing.
*/
#ifndef _IOC_NONE
# define _IOC_NONE 0U
#endif
#ifndef _IOC_WRITE
# define _IOC_WRITE 1U
#endif
#ifndef _IOC_READ
# define _IOC_READ 2U
#endif
#define _IOC(dir,type,nr,size) \
(((dir) << _IOC_DirsHIFT) | \
((type) << _IOC_TYPESHIFT) | \
((nr) << _IOC_NRSHIFT) | \
((size) << _IOC_SIZESHIFT))
#define _IOC_TYPECHECK(t) (sizeof(t))
/*
* Used to create numbers.
*
* NOTE: _IOW means userland is writing and kernel is reading. _IOR
* means userland is reading and kernel is writing.
*/
#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
#define _IOR(type,size) _IOC(_IOC_READ,(_IOC_TYPECHECK(size)))
#define _IOW(type,size) _IOC(_IOC_WRITE,(_IOC_TYPECHECK(size)))
#define _IOWR(type,size) _IOC(_IOC_READ|_IOC_WRITE,(_IOC_TYPECHECK(size)))
#define _IOR_BAD(type,sizeof(size))
#define _IOW_BAD(type,sizeof(size))
#define _IOWR_BAD(type,sizeof(size))
/* used to decode ioctl numbers.. */
#define _IOC_DIR(nr) (((nr) >> _IOC_DirsHIFT) & _IOC_DIRMASK)
#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
/* ...and for the drivers/sound files... */
#define IOC_IN (_IOC_WRITE << _IOC_DirsHIFT)
#define IOC_OUT (_IOC_READ << _IOC_DirsHIFT)
#define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DirsHIFT)
#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT)
#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
#endif /* _ASM_GENERIC_IOCTL_H */
#endif /* _LINUX_IOCTL_H */
此文件不包含任何内容!这是一个死胡同,仍然没有丝毫TIocgWINSZ
...
发生了什么?我一无所知...
POSIX 编程正在成为一门失传的艺术吗?文档在哪里?如果标准如此杂乱无章,任何人怎么能指望程序员新手学习任何东西...
对我来说,似乎每个人都喜欢将编码作为一种爱好……即使他们的代码在没有文档的情况下对世界毫无用处。我知道一些孤独的狼可以做到这一点,但我永远无法从 POSIX 标准中想象这样的事情......
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。