标签: fcntl

linux fcntl - unsetting flag

如何使用fcntl取消已设置的标志?

例如,我可以使用将套接字设置为非阻塞模式

fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)
Run Code Online (Sandbox Code Playgroud)

现在,我想取消设置O_NONBLOCK标志.

我试过fcntl(sockfd,F_SETFL,flags | ~O_NONBLOCK).它给了我错误EINVAL

linux fcntl

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

死锁,包括羊群,叉子和终止父进程

我有一个非常复杂的python程序。在内部,它具有使用独占(LOCK_EX)fcntl.flock来管理全局锁定的日志记录系统。实际上,每当转储日志消息时,都会获取全局文件锁,将消息发射到文件(与锁定文件不同),然后释放全局文件锁。

该程序还将自身分叉几次(在设置日志管理之后)。通常,一切正常。

如果父进程被杀死(孩子仍然活着),我偶尔会陷入僵局。所有程序都永远在fcntl.flock()上阻塞。试图从外部获取锁也会永远受阻。我必须杀死儿童程序才能解决此问题。

令人困惑的是lsof lock_file没有显示任何持有该锁的进程!因此,我无法弄清楚为什么文件被内核锁定了,但是没有进程被报告为持有该文件。

羊群叉有问题吗?即使死进程的父进程不再在进程表中,死去的父进程是否仍以某种方式持有该锁?我该如何解决这个问题?

python fork locking flock fcntl

6
推荐指数
1
解决办法
1771
查看次数

在没有轮询的情况下收到关于flock/lockf/fcntl的通知更改

是否有一种方法(在Linux中)无需轮询即可获取文件锁定状态的更新?

我知道状态可以通过lockf(fd,F_TEST)或推测LOCK_NB | LOCK_SH进行轮询,但轮询不好(tm).

当然,找出文件未锁定的时间可以通过简单的锁定尝试来完成,但我也想对其他边缘进行采样(用例:一个(大)程序使用lockf在实例之间进行同步 - 我可能会得到它变成了flock,我想添加一个GUI,当锁可以获取时显示,当然不会占用锁定).

请注意,inotify在这种情况下不起作用,至少在linux 3.9.1上是这样.

linux notifications inotify flock fcntl

6
推荐指数
0
解决办法
378
查看次数

如何检查文件是否被锁定?

我有以下代码,我想检查文件是否被锁定.如果没有,那么我想写信给它.我通过在两个终端上同时运行它来运行此代码但是我每次都在两个选项卡中都处于"锁定"状态,即使我没有锁定它.代码如下:

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    struct flock fl,fl2;
    int fd;

    fl.l_type   = F_WRLCK;  /* read/write lock */
    fl.l_whence = SEEK_SET; /* beginning of file */
    fl.l_start  = 0;        /* offset from l_whence */
    fl.l_len    = 0;        /* length, 0 = to EOF */
    fl.l_pid    = getpid(); /* PID */

    fd = open("locked_file", O_RDWR | O_EXCL | O_CREAT);
    fcntl(fd, F_GETLK, &fl2);
    if(fl2.l_type!=F_UNLCK)
    {
        printf("locked");
    }
    else
    {
        fcntl(fd, F_SETLKW, &fl); /* set lock */
        write(fd,"hello",5);
        usleep(10000000); …
Run Code Online (Sandbox Code Playgroud)

c locking file fcntl

6
推荐指数
1
解决办法
4811
查看次数

如何强制链接到较旧的libc`fcntl`而不是`fcntl64`?

似乎GLIBC 2.28(于2018年8月发布)对fcntl进行了相当激进的更改。定义已更改<fcntl.h>为不再是外部函数,而是#define更改为fcntl64

其结果是,如果你的系统上使用此glibc的编译代码-如果它使用的fcntl()在所有从2018年八月前--the生成的二进制文件将不能在系统上执行这会影响到相当多的各种应用.. .fcntl()的手册页显示,这是一小部分子功能的入口:

https://linux.die.net/man/2/fcntl

如果您可以告诉链接器所需的GLIBC函数的特定版本,那就太好了。但是我发现最接近的是在另一篇文章的答案中描述的这个技巧:

回答“在.so文件中链接到较旧的符号版本”

这有点复杂。 fcntl是不vffcntl带va_list的可变参数。在这种情况下,您无法转发可变参数函数的调用。:-(

当一个程序具有稳定的代码且具有较低的依赖关系时,就很难在当前的Ubuntu上构建它了……然后让可执行文件拒绝在仅一年前(近日)发布的另一个Ubuntu上运行。一个人有什么追索权?

c glibc variadic-functions ld fcntl

6
推荐指数
1
解决办法
270
查看次数

我可以让fcntl和Perl警报合作吗?

我在Linux上,nfs,涉及多台机器.

我正在尝试使用fcntl来实现文件锁定.我一直在使用flock,直到我发现它只能在同一台机器上的进程之间工作.

现在当我用F_SETLKW调用fcntl时,perl警报(用于添加超时)不像以前那样工作.这通常没问题,但是ctrl-c也没有用.

我相信正在发生的事情是,fcntl每隔30秒左右只检查一次信号.警报最终会回来.ctrl-c最终被抓住了.

有什么办法可以调整fcntl检查这些信号的频率吗?

perl nfs locking fcntl

5
推荐指数
1
解决办法
449
查看次数

如何使用“fcntl()”锁定和解锁pid文件

我在网上甚至在 stackoverflow 上进行了研究,以便找到一个fcntl()用于锁定和解锁 pid 文件的示例,"/var/run/myapp.pid"但我没有找到明确的示例。

您能否指出一个fcntl()用于锁定和解锁 pid 文件的示例?

不应阻止锁定(如果文件已被锁定)

c linux fcntl

5
推荐指数
1
解决办法
2724
查看次数

无法在linux中使用fcntl切换到阻塞模式

我有一个示例程序:

int main()
{
   const char* fn = "/tmp/tmpfifo";
   int i = mkfifo(fn, 0666);
   int fd = open(fn, O_RDONLY | O_NONBLOCK);
   int flags = fcntl(fd, F_GETFL);
   flags &= ~O_NONBLOCK;
   fcntl(fd, F_SETFL, flags);

   char buf[1024];
   int rd= read(fd, buf, 100);
   cout << rd << endl;
   remove(fn);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

似乎在从文件描述符中删除非阻塞标志之后,read调用应该阻塞,直到将某些内容写入FIFO,但我的程序总是在没有阻塞和rd=0结果的情况下运行.你能解释一下这种行为吗?谢谢!

c linux io nonblocking fcntl

5
推荐指数
1
解决办法
706
查看次数

c-F_GETFL和F_SETFL的用法

在尝试fcntl()与command F_GETFL和结合使用时F_SETFL,我遇到了一些问题:

  1. 为什么fcntl(fd, F_GETFL)打开文件时返回的标志仅包含我设置的位的子集?它仅显示可修改的内容吗?

  2. 使用时fcntl(fd, F_SETFL, flag),我应该如何传递标志参数,我是否需要先通过标志读取标志fcntl(fd, F_GETFL),然后对其进行修改并传递它?还是在内部它只是&对新的参数做了一点操作?

  3. 在哪里可以找到打开文件标志的32位(或更少)位的完整列表?

代码-[dup_fd_share.c]:

// prove duplicated fd shared file offset and open file status,
// TLPI exercise 5.5

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>

#define BUF_SIZE 100

void fd_share() {
    char *fp = "/tmp/fd_share.txt";
    char *buf = "abc\n";
    int write_size = 4;
    int fd, fd2;
    off_t cur, cur2;
    int open_flag, open_flag2;

    // open
    int flag = …
Run Code Online (Sandbox Code Playgroud)

c file-io fcntl

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

在磁盘上分配文件而不进行归零

我需要分配大文件而不归零它的内容.我正在fopen => ftruncate => fclose => mmap => (...work...) => munmap以巨大的文件大小(数百千兆字节)制作这些步骤.应用程序挂起终止几分钟,而系统正在尝试将文件字节归零 - 恕我直言,因为ftruncate使用.

ftruncate(ofd, 0);

#ifdef HAVE_FALLOCATE

    int ret = fallocate(ofd, 0, 0, cache_size);
    if (ret == -1) {
        printf("Failed to expand file to size %llu (errno %d - %s).\n", cache_size, errno, strerror(errno));
        exit(-1);
    }

#elif defined(HAVE_POSIX_FALLOCATE)

    int ret = posix_fallocate(ofd, 0, cache_size);
    if (ret == -1) {
        printf("Failed to expand file to size %llu (errno %d - %s).\n", cache_size, errno, strerror(errno));
        exit(-1);
    }

#elif defined(__APPLE__) …
Run Code Online (Sandbox Code Playgroud)

c macos posix fcntl fallocate

5
推荐指数
1
解决办法
299
查看次数

标签 统计

fcntl ×10

c ×6

linux ×4

locking ×3

flock ×2

fallocate ×1

file ×1

file-io ×1

fork ×1

glibc ×1

inotify ×1

io ×1

ld ×1

macos ×1

nfs ×1

nonblocking ×1

notifications ×1

perl ×1

posix ×1

python ×1

variadic-functions ×1