问题标签 [flock]

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 投票
1 回答
2637 浏览

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

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

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

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

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

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

0 投票
1 回答
387 浏览

php - PHP - PHPUnit - 测试保护文件锁的能力

我正在为我的核心库更新单元测试,遇到了一个关于文件锁(flock)的场景,想看看其他人是如何实现这些类型的单元测试的。

基本上我有一个实用文件类,它将内容写入文件:

我的单元测试看起来像:

正如您从测试代码中看到的那样,在$this->destFileUri对方法进行 API 调用之前,我将显式锁定write()。我期望的是throw new CoreLib_Api_Exception('Unable to obtain lock on file');抛出异常。相反,我的单元测试只是无限期地挂起。

测试文件是否有锁的正确方法是什么?

提前致谢。

0 投票
1 回答
880 浏览

php - PHP 同时文件访问/flock() 问题

我在实现一个脚本时遇到了麻烦,该脚本应该从文件中解析一个 json 字符串,要么覆盖具有相同 id 的对象,要么将其添加到 json 数组并将其写回文件。该脚本在for循环中调用,因此我尝试使用flock来防止在解析json字符串之前覆盖文件,但结果看起来很奇怪,我不知道出了什么问题。这是脚本:

结果我有时会得到三个文件,一个名为“.json”,另一个是正确的用户 ID .json 和 log.json。日志看起来最好,因为所有 26 个对象都正确显示,但之前没有检查退出的对象。“.json”只是空白,看起来很奇怪:

我也有一个例外:

我想我没有正确理解这个程序,我很高兴能得到任何帮助。

编辑:我想要的结果是这样的:

干杯,丹尼尔

0 投票
1 回答
4263 浏览

php - 如何使用群()

我想使用系统锁来避免竞争条件。一个过程是将捕获的图像保存到 .jpg 文件的 opencv 程序。另一个过程是浏览器从服务器获取相同的图像文件。我想避免这两个进程之间的竞争条件。我使用的羊群功能对吗?

我的opencv代码是:

我的 .php 文件是

该 php 由客户端使用 AJAX 调用。

0 投票
2 回答
13200 浏览

c - 多个线程能够同时获得flock

我的印象是flock(2)是线程安全的,我最近在代码中遇到了一个案例,其中多个线程能够在同一个文件上获得锁,这些锁都与使用获得独占锁同步c api 群。进程 25554 是具有 20 个线程的多线程应用程序,当死锁发生时,锁定同一文件的线程数会有所不同。多线程应用程序testEvent是文件的写入者,而推送是文件的读取者。不幸的是,lsof它不打印 LWP 值,所以我找不到哪些是持有锁的线程。当下面提到的情况发生时,进程和线程都被困在 flock 调用上,如pstackor所示strace调用 pid 25569 和 25554。有关如何在 RHEL 4.x 中克服此问题的任何建议。

我想更新的一件事是,flock 并不总是行为不端,当消息的 tx 速率超过 2 mbps 时,我才会遇到与 flock 的死锁问题,低于该 tx 速率的所有内容都是文件。我保持num_threads= 20, size_of_msg= 1000bytes 不变,只是将每秒发送的消息数量从 10 条消息变为 100 条消息,即 20 * 1000 * 100 = 2 mbps,当我将消息数量增加到 150 时,然后群发发生。

我只是想问一下您对flockfile c api的看法。

将调用write_data_lib_funclib 函数的多线程测试程序。

上面的方法会在测试的main函数中的pthreads中调用。

}

这是作者/阅读器源,由于专有原因,我不想只是剪切和粘贴,作者源将在一个进程中访问多个线程

在读者方面是一个没有线程的守护进程。

0 投票
3 回答
9760 浏览

php - 使用flock()检查文件是否已经被锁定?

我有一个要写入的文件,但我需要先锁定它(使用flock()),以防止任何其他脚本写入它。所以我有:

但是我需要检查它是否已经被锁定,以防止其他脚本写入它。

我怎样才能做到这一点?

0 投票
1 回答
282 浏览

php - 在文件路径数组上使用flock()不起作用

我有一个功能可以锁定某个文件夹中的所有文件:

所以我称这个函数为:

现在似乎找到了文件夹中的所有文件,将它们分配给数组,但由于某种原因,它似乎没有锁定文件。在对其进行测试后(使用 sleep() 并尝试使用其他脚本写入文件),flock()似乎对文件没有任何影响......

任何想法为什么会发生这种情况?

谢谢

0 投票
1 回答
1079 浏览

c - flock(),然后是 fgets():低级锁,然后是 stdio 读/写库函数。是否可以?

我正在写一个服务器网络。

每个连接都由一个单独的线程提供服务,所以我事先不知道线程的数量

还有一组文本文件(也不知道数量),每个线程可以对每个文件进行读/写。

一个文件一次只能由一个线程写入,但不同的线程可以同时写入不同的文件。

如果一个文件被一个或多个线程读取(读取可以是并发的),则没有线程可以在该文件上写入。

现在,我注意到了这个(线程安全的多文件写入)解决方案,但我也想使用函数作为 fgets(),例如。

那么,我可以flock()一个文件,然后使用fgets() 或另一个stdio 读/写库函数吗?

0 投票
2 回答
2721 浏览

php - 同时写入同一个文件

好的,我知道这个网站上有关于这个问题的类似问题,但是这些问题和提供的答案都不是我所需要的。

我正在构建基于平面文件的 CMS。如果,例如:

  1. 2, 3, 10..... fwrite 在附加模式请求同时到达同一个php文件“contact_form_messages_container.php”?

  2. 2, 3, 10 ..... fwrite 在“w”模式请求来到同一个 php 文件,该文件包含特定页面访问的简单数字,再次同时?

我知道flock()函数,但它可能会同时出现两个或多个flock()请求......有谁知道这个问题的解决方案?我唯一想到的是使用 while 循环在一段时间内使用睡眠()-ing 脚本,直到目标文件变得可用,但我不知道它是否有效,在哪里以及如何执行此操作?有没有人有这个问题的实际经验?提前致谢!

0 投票
2 回答
1864 浏览

perl - Perl:flock() 在 Linux 上工作,忽略 AIX 上的先前锁定

简而言之:使用flock() 编写了一个Perl 脚本。在 Linux 上,它的行为符合预期。在 AIX 上,flock() 始终返回 1,即使脚本的另一个实例使用 flock() 应该持有锁定文件的排他锁。

我们发布了一个 Bash 脚本来重新启动我们的程序,依靠 flock(1) 来防止同时重新启动产生多个进程。最近我们部署在 AIX 上,默认情况下,flock(1) 不会出现,管理员也不会提供。为了简单起见,我写了一个 Perl 脚本,叫做flock,像这样:

我通过从两个终端选项卡几乎同时运行两次 (flock -n -x 200; sleep 60)200>lockfile 来测试脚本。

在 Linux 上,如预期的那样,第二次运行因“资源暂时不可用”而终止。

在 AIX 上,第二次运行获得锁,flock() 返回 1,这绝对不是预期的。

我了解flock() 在两个系统上的实现方式不同,Linux 版本使用flock(1),而AIX 版本使用fcntl(1)。我没有足够的专业知识来了解这如何导致我的问题以及如何解决它。

非常感谢您的任何建议。