我正在开发一个顺序写入大文件(并且根本不读取)的应用程序,我想posix_fadvise()用来优化文件系统行为.
联机帮助页中的功能描述表明最合适的策略是POSIX_FADV_SEQUENTIAL.但是,Linux实现描述怀疑:
在Linux下,
POSIX_FADV_NORMAL将预读窗口设置为后备设备的默认大小;POSIX_FADV_SEQUENTIAL将此大小加倍,并POSIX_FADV_RANDOM完全禁用文件预读.
因为我只是在写数据(可能也会覆盖文件),所以我不希望有任何预告.我应该坚持使用POSIX_FADV_SEQUENTIAL或更确切地说使用POSIX_FADV_RANDOM它来禁用它吗?
其他选项怎么样,比如POSIX_FADV_NOREUSE?或者根本不posix_fadvise()用于写作?
我们目前正在升级我们的Varnish Cache服务器.作为该过程的一部分,我们仅升级其中一个,以查看它与旧版本相比的行为方式.
在这个新版本中进行的一些主要更改是将正则表达式引擎从POSIX更改为PCRE.这意味着我们的一些清除(正则表达式清除)已停止在较新的服务器上工作.
我想知道是否有人可以列出/指出POSIX和PCRE之间的实际语法差异列表.或者也许是将POSIX正则表达式转换为PCRE正则表达式的函数.
这样我只能转换到新服务器的清除 - 而不会影响系统中为其他服务器实现的当前正则表达式语法.
在XSH 2.9.1中,wctomb列为不需要线程安全的函数之一.但是,相反的转换函数mbtowc不会出现在列表中.在使用转换状态的编码的实现上,既没有线程安全的API,也没有必要要求一个是线程安全的而另一个不是,而在没有禁止有状态编码的情况下它们都不是线程安全的.
同样地wcstombs(在列表中)和mbstowcs(不是).由于这两个函数都在整个字符串上运行,这些字符串在初始移位状态下开始和结束,因此它们不是有状态的,它们的API是线程安全的,而且一个方向被指定为线程安全而不是没有意义其他.
任何人都可以对此有所了解吗?
我对非递归情况最感兴趣,但我猜测其他可能跟踪这个问题的人会更喜欢看到递归情况.
基本上,我们的目标是:
rm -rf <target>
Run Code Online (Sandbox Code Playgroud)
但是,系统调用将是一个不成熟的答案.
对不起,我知道这是愚蠢的但linux libc源代码在哪里?我从GNU下载的内容似乎不是我想要的,特别是我在pthreads函数系列中找不到任何内容.
某处是否存在在线(高压交叉引用)版本?
对齐malloc是posix_memalign,那没关系,但对齐realloc呢?是realloc保留对齐还是如何确保重新分配的内存具有相同的对齐方式?假设Linux和x86_64.
显然POSIX说明了这一点
文件描述符或流在其引用的打开文件描述上称为"句柄"; 打开的文件描述可能有几个句柄.[...]应用程序影响第一个句柄上文件偏移量的所有活动都应暂停,直到它再次成为活动文件句柄.[...]句柄不需要在同一过程中应用这些规则.- POSIX.1-2008
和
如果两个线程分别调用[write()函数],则每个调用应该看到另一个调用的所有指定效果,或者没有看到它们.- POSIX.1-2008
我对此的理解是,当第一个进程发出
write(handle, data1, size1)第二个进程并且第二个进程发出时
write(handle, data2, size2),写入可以以任何顺序发生,但是data1并且data2 必须既是原始的又是连续的.
但运行以下代码会给我带来意想不到的结果.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
die(char *s)
{
perror(s);
abort();
}
main()
{
unsigned char buffer[3];
char *filename = "/tmp/atomic-write.log";
int fd, i, j;
pid_t pid;
unlink(filename);
/* XXX Adding O_APPEND to the flags cures it. Why? */
fd = open(filename, O_CREAT|O_WRONLY/*|O_APPEND*/, 0644);
if (fd < 0)
die("open failed"); …Run Code Online (Sandbox Code Playgroud) 我有以下代码,我试图编译.当我尝试使用std = c99时,它失败并显示有关"类型struct addrinfo的隐式声明"和"函数getaddrinfo的隐式声明"的警告.它适用于std = gnu99.
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
int fails(const char *host, const char *port, struct addrinfo *hints)
{
int rc;
struct addrinfo *results;
// can't find this function??
rc = getaddrinfo(host, port, hints, &results);
// free memory in this important application
freeaddrinfo(results);
return rc;
}
Run Code Online (Sandbox Code Playgroud)
我用来编译的命令是:
gcc -c -o fail.o -Wall -Werror -std=c99 -save-temps fail.c
gcc -c -o fail.o -Wall -Werror -std=gnu99 -save-temps fail.c
Run Code Online (Sandbox Code Playgroud)
看看fail.i(预处理标题)我看到编译器是正确的:那些类型还没有在引入的头文件中声明.
所以我去了标题并注意到getaddrinfo被一个保护#ifdef __USE_POSIX包围,显然在用c99编译时没有声明.
我怎么告诉gcc我想用c99和POSIX?如果我决定稍后切换编译器(例如Clang或icc),我真的不想使用gnu99.
函数签名write(2)是ssize_t write(int fd, const void *buf, size_t count).通常,最大值size_t大于ssize_t.这是否意味着write实际写入的数据量实际上是SSIZE_MAX代替SIZE_MAX?如果不是这种情况,当写入的字节数大于SSIZE_MAX溢出时会发生什么?
我基本上想知道写入的数据量write是否受限于SSIZE_MAX或SIZE_MAX.
操作系统:Debian 9 (Linux 4.9)
编译器:GCC 8.2
目前我包括<stddef.h>(size_t定义在哪里)和<stdint.h>(定义了大多数整数类型),但我仍然没有ssize_t.
它在哪里定义?