标签: posix

什么posix_fadvise()args用于顺序文件写入?

我正在开发一个顺序写入大文件(并且根本不读取)的应用程序,我想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()用于写作?

c optimization posix

17
推荐指数
2
解决办法
7158
查看次数

正则表达式语法在POSIX和PCRE之间发生变化

我们目前正在升级我们的Varnish Cache服务器.作为该过程的一部分,我们仅升级其中一个,以查看它与旧版本相比的行为方式.

在这个新版本中进行的一些主要更改是将正则表达式引擎从POSIX更改为PCRE.这意味着我们的一些清除(正则表达式清除)已停止在较新的服务器上工作.

我想知道是否有人可以列出/指出POSIX和PCRE之间的实际语法差异列表.或者也许是将POSIX正则表达式转换为PCRE正则表达式的函数.

这样我只能转换到新服务器的清除 - 而不会影响系统中为其他服务器实现的当前正则表达式语法.

regex caching pcre posix varnish

17
推荐指数
1
解决办法
5467
查看次数

为什么POSIX指定wctomb为非线程安全的,但不是mbtowc?

在XSH 2.9.1中,wctomb列为不需要线程安全的函数之一.但是,相反的转换函数mbtowc不会出现在列表中.在使用转换状态的编码的实现上,既没有线程安全的API,也没有必要要求一个是线程安全的而另一个不是,而在没有禁止有状态编码的情况下它们都不是线程安全的.

同样地wcstombs(在列表中)和mbstowcs(不是).由于这两个函数都在整个字符串上运行,这些字符串在初始移位状态下开始和结束,因此它们不是有状态的,它们的API是线程安全的,而且一个方向被指定为线程安全而不是没有意义其他.

任何人都可以对此有所了解吗?

c posix thread-safety multibyte

17
推荐指数
1
解决办法
921
查看次数

如何在(POSIX)C中删除目录及其内容?

我对非递归情况最感兴趣,但我猜测其他可能跟踪这个问题的人会更喜欢看到递归情况.

基本上,我们的目标是:

rm -rf <target>
Run Code Online (Sandbox Code Playgroud)

但是,系统调用将是一个不成熟的答案.

c directory posix

17
推荐指数
4
解决办法
4万
查看次数

libc源位置 - 用于下载或在线查看?

对不起,我知道这是愚蠢的但linux libc源代码在哪里?我从GNU下载的内容似乎不是我想要的,特别是我在pthreads函数系列中找不到任何内容.

某处是否存在在线(高压交叉引用)版本?

c linux posix glibc pthreads

17
推荐指数
3
解决办法
2万
查看次数

realloc是否保持posix_memalign的内存对齐?

对齐mallocposix_memalign,那没关系,但对齐realloc呢?是realloc保留对齐还是如何确保重新分配的内存具有相同的对齐方式?假设Linux和x86_64.

c linux gcc posix

17
推荐指数
1
解决办法
5237
查看次数

`write(2)`对本地文件系统的原子性

显然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)

c file-io posix multiprocessing

17
推荐指数
4
解决办法
5175
查看次数

为什么在使用gcc和std = c99进行编译时找不到getaddrinfo

我有以下代码,我试图编译.当我尝试使用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.

c gcc posix

17
推荐指数
1
解决办法
7754
查看次数

写(2)是否总是写入小于或等于SSIZE_MAX?

函数签名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_MAXSIZE_MAX.

c posix

17
推荐指数
2
解决办法
2381
查看次数

ssize_t 在 Linux 中定义在哪里?

操作系统:Debian 9 (Linux 4.9)

编译器:GCC 8.2

目前我包括<stddef.h>size_t定义在哪里)和<stdint.h>(定义了大多数整数类型),但我仍然没有ssize_t.

它在哪里定义?

c linux types posix include

17
推荐指数
2
解决办法
1万
查看次数