我在/usr/include/limits.h中找到了以下定义:
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647
此外,似乎此头文件中的所有XXX_MAX都是从数字常量中明确定义的.
我想知道是否有一种可移植的方式(跨平台的不同字大小)来定义INT_MAX?
我尝试了以下方法:
~((int)-1)
但这似乎不正确.
一个简短的解释也受到高度重视.
看来对常规文件的写入/读取不能成为非阻塞的。我找到了以下支持参考:
摘自《Linux 编程接口:Linux 和 UNIX 系统编程手册》:
"--- 非阻塞模式可以与设备(例如,终端和伪终端)、管道、FIFO 和套接字一起使用。(因为管道和套接字的文件描述符不是使用 open() 获得的,所以我们必须使用 fcntl 启用此标志() F_SETFL 操作在第 5.3 节中描述。) O_NONBLOCK 对于常规文件通常被忽略,因为内核缓冲区高速缓存确保常规文件上的 I/O 不会阻塞,如第 13.1 节中所述。但是,O_NONBLOCK 对常规文件确实有影响使用强制文件锁定时的文件(第 55.4 节)。 ---”
来自 UNIX 环境中的高级编程第二版:
“--- 我们还说过,与磁盘 I/O 相关的系统调用并不被认为是慢的,即使磁盘文件的读取或写入可能会暂时阻塞调用者。---”
来自http://www.remlab.net/op/nonblock.shtml:
“--- 常规文件总是可读的,也总是可写的。这一点在相关的 POSIX 规范中有明确规定。这一点我怎么强调都不为过。将常规文件置于非阻塞状态除了改变其中的一位之外绝对没有任何影响。文件标志。从常规文件读取可能需要很长时间。例如,如果它位于繁忙的磁盘上,I/O 调度程序可能会花费太多时间,以至于用户会注意到应用程序被冻结。尽管如此,非-阻塞模式不起作用。它根本不起作用。检查文件的可读性或可写性总是立即成功。如果系统需要时间来执行 I/O 操作,它会将任务从读取状态置于不可中断睡眠状态或者编写系统调用。---”
当内存足够可用时,通过内核缓冲执行读/写。
我的问题是:是否存在内核内存不足导致缓冲无法立即使用的情况?如果是,内核会做什么?简单地返回一个错误或执行一些惊人的技巧?
多谢你们!
我正在编写一个程序,其中包括/usr/include/linux/time.h和/usr/include/stdlib.h.
问题是:
stdlib.hinclude /usr/include/time.h,它定义了 ' struct timespec',/usr/include/linux/time.h也定义了一个。这引入了重新定义的编译错误。
我检查了'struct timespec'这两个头文件中的定义:
在 /usr/include/time.h 中:
struct timespec
{
__time_t tv_sec; /* Seconds. */
long int tv_nsec; /* Nanoseconds. */
};
Run Code Online (Sandbox Code Playgroud)
在 /usr/include/linux/time.h 中:
struct timespec {
__kernel_time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
Run Code Online (Sandbox Code Playgroud)
看起来这些定义确实是等价的,但我无法证明。
我的问题是:是否有一种可靠的方法来解决这种重新定义?
也非常感谢有关此问题的讨论的链接。谢谢。