问题标签 [fcntl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
329 浏览

c - POSIX 系统清除未完全解锁的文件锁的顺序是什么?

状态的POSIX 规范fcntl()

当该文件的文件描述符被该进程关闭或持有该文件描述符的进程终止时,应删除与给定进程的文件关联的所有锁。

这个解锁被终止进程持有的文件段锁的操作是否是每个文件的原子操作?换句话说,如果进程锁定了文件的字节段 B1..B2 和 B3..B4,但在终止之前没有解锁这些段,那么当系统开始解锁它们时,就是段 B1..B2 和 B3。 .B4 既能解锁,又能锁定fcntl()文件段的另一个操作成功吗?如果不是每个文件的原子,系统解锁这些文件段的顺序是否取决于最初获取文件段的顺序?

的规范fcntl()没有说,但可能在 POSIX 规范中有一个一般规定,该规定要求在进程不干净退出或崩溃后清理操作的确定性顺序。

0 投票
1 回答
2637 浏览

python - 与flock、fork和终止父进程的死锁

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

该程序还会多次分叉(在设置日志管理之后)。一般来说,一切正常。

如果父进程被杀死(并且子进程还活着),我偶尔会遇到死锁。所有程序都fcntl.flock()永远阻塞。尝试从外部获取锁也会永远阻塞。我必须杀死儿童程序来解决问题。

令人费解的是,它lsof lock_file没有显示持有锁的进程!所以我无法弄清楚为什么文件被内核锁定但没有进程报告为持有它。

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

0 投票
1 回答
783 浏览

php - PHP 每隔几秒调用一次 pcntl_signal_dispatch()

我有一个以阻塞模式从管道读取的 PHP 脚本。

我希望能够在我的脚本等待来自管道的输入时每隔几秒执行一次 pcntl_signal_dispatch,而不会干扰排队的管道读取。

有什么建议么?

0 投票
7 回答
33754 浏览

python - Python fcntl 未按预期锁定

在基于 Debian 的操作系统(Ubuntu、Debian Squeeze)上,我使用 Python(2.7、3.2)fcntl 来锁定文件。据我了解,fnctl.flock 以某种方式锁定文件,如果另一个客户端想要锁定同一个文件,则会引发异常。

我构建了一个小例子,我希望会抛出一个异常,因为我首先锁定了文件,然后,紧接着,我再次尝试锁定它:

但是该示例仅打印“无错误”。

如果我将此代码拆分为同时运行的两个客户端(一个锁定然后等待,另一个在第一个锁定已经激活后尝试锁定),我会得到相同的行为 - 完全没有效果。

这种行为的解释是什么?

编辑

根据 nightcracker 的要求进行更改,此版本也打印“无错误”,尽管我不希望这样:

0 投票
0 回答
629 浏览

python - Python fcntl 模块在不同的 Linux 内核上是否不同?

我有一个 Python 脚本,它使用 Python fcntl 模块通过文件系统调用进行锁定。

该脚本在 Ubuntu 10.10 版本上运行良好。

但是如果我在 Centos 6.2 主机上运行相同的脚本,脚本会出现以下错误:

*AttributeError:“模块”对象没有属性“F_WRLCK”*

实际代码是:

在 Centos 主机上,脚本炸弹在最后一行。

为什么 fcntl 模块在 Centos 6.2 内核上没有 F_WRLCK 属性,但在 Ubuntu 上却有?

仅供参考,Ubuntu 10.10 和 Centos 6.2 都在运行 Python 2.6.6。

有解决方法或解决方案吗?我需要使用 fcntl 而不是群发。

0 投票
2 回答
1108 浏览

c - 无法关闭使用 popen 打开的文件

我是 C 语言的新手,今天,我在尝试关闭使用 popen 函数创建的“Open Stream”时遇到了一个问题。1. 这个问题是不是因为我在这个程序中使用了 poll 函数?2.还是因为fcntl功能?如果有人教我这个问题的确切原因,我会很高兴。我附上下面的代码示例,请看一下。

代码示例:

输出:

在这里,我希望提示出现在执行结束时。但是,它不会到来。

0 投票
2 回答
3108 浏览

python - python - ioctl 数字可以与 C ioctl 数字不同吗?

据我所知,ioctl 编号由驱动程序很好地定义并在内核中注册。

我正在使用 python 中的一些代码来查询操纵杆状态。我已经阅读了这个关于游戏杆 api的文档,这个关于 ioctl numbers的文档,以及这个来自 python fcntl 模块的文档。

我创建了一个用于测试和查询值的 C 程序,并且 python 使用我从这里获取的用于实现_IOR()C 宏的代码进行测试。

内核驱动定义:

C程序

C程序输出:

Python 输出

有什么想法为什么我不能用那个 ioctl 号查询文件描述符?ioctl()并且fcntl()函数采用文件描述符或具有fileno()实现方法的对象,因此我从对象中剔除错误file

也许问题来自数字转换和类型,不知道......线索?

0 投票
1 回答
412 浏览

c++ - 关于 ev_default_fork 的 libev 标志

我在学习libev。但我不ev_default_fork明白ev_loop. 这是关闭执行的问题吗?喜欢FD_CLOEXEC fcntl()国旗吗?什么时候需要设置标志?什么情况下需要这个标志?这是对文档的描述:

此函数设置一个标志,导致后续 ev_loop 迭代重新初始化具有内核状态的后端的内核状态。尽管有这个名字,你可以随时调用它,但是在分叉之后,在子进程(或子进程和父进程,但这又没有意义)中最有意义。在使用任何 libev 函数之前,您必须在子进程中调用它,并且它只会在下一次 ev_loop 迭代时生效。

另一方面,当且仅当您想在子进程中使用事件库时,您才需要在子进程中调用此函数。如果你只是 fork+exec,你根本不需要调用它。

该函数本身非常快,并且在分叉后调用它通常不是问题。为了简单起见,该函数将非常适合调用 pthread_atfork: pthread_atfork (0, 0, ev_default_fork);

0 投票
1 回答
431 浏览

c - 带有 CLONE_FILES 的 clone(2) 泄漏 fcntl 锁?

我希望每个 clone() 都会等待锁定。但是此代码的输出(类似这样):

但是当我从 clone(2) 中删除 CLONE_FILES 字段集时,一切顺利。其他克隆线程将等待 lock()。

输出:

还有其他选择(使用 CLONE_FILES)吗?为什么会出现这种行为?

该领域的初学者。

0 投票
2 回答
1137 浏览

linux - 如何在 perl 中使用 O_ASYNC 和 fcntl?

我想使用 O_ASYNC 选项,当管道可以读取时,SIGIO 的处理程序将运行。

但以下代码不起作用。任何人都可以帮助我吗?

我的 perl 版本是 5.16.1,操作系统是 Redhat 5u4,内核 2.6.18,x86_64