php - semop 调用的 EINTR 错误

标签 php c semaphore

我在 php 脚本中使用以下代码片段来安全地更新共享资源。

$lock_id = sem_get( ftok( 'tmp/this.lock', 'r'));
sem_acquire($lock_id)
//do something
sem_release($lock_id)

当我用大量请求对这段代码进行压力测试时,出现错误:

Warning: semop() failed acquiring SYSVSEM_SETVAL for key 0x1e: No space left on device in blahblah.php on line 1293

php 源显示获取 SYSVSEM_SETVAL 失败的以下代码

while (semop(semid, sop, 3) == -1) {
    if (errno != EINTR) {
        php3_error(E_WARNING, "semop() failed acquiring SYSVSEM_SETVAL for key 0x%x: %s", key, strerror(errno));
        break;
    }
}

这意味着 semop 因 EINTR 而失败。手册页显示 semop() 系统调用被信号中断。

我的问题是我可以安全地忽略这个错误并重试 sem_acquire 吗?

编辑:我误解了这个问题,请查看我在下面发布的说明。

拉吉

最佳答案

我不会忽略 ENOSPC(如代码所示,您得到的不是 EINTR)。您可能会陷入一个繁忙的循环,等待您之前已经耗尽的资源。如果你在某个地方用完了一些空间,你想确保你处理了那个问题。 ENOSPC 通常意味着您不在……某事内。

几个随机的想法:

我不是 PHP 实现方面的专家,但我会尽量避免在每次需要信号量时调用 sem_get()。而是存储 handle 。可能是某些资源与对 sem_get 的每次调用相关联,这就是空间不足的地方。

我会确保检查您在 sem_get() 上返回的错误。这是一个代码片段,但如果您未能获得 sema4,则在尝试 sem_op() 时会得到不一致的结果(也许 EINTR 有意义)

关于php - semop 调用的 EINTR 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/272504/

相关文章:

c - long long 数据类型是不够的。如何不失去精度?

php - 我可以在 php 中编写一个带有多个可选参数但至少必须使用一个参数的函数吗?

计算C程序中用户输入的个数

java - 什么等同于 Java World 中的 PHP Zend Framework

c++ - 如何获取过滤器驱动程序中当前进程镜像文件的全名?

c - 线程函数内部函数中的信号量值不一致

c++ - 我的信号量(来自 Boost 的 named_semaphore)做错了什么?

C - 当生产者大于缓冲区大小时,消费者/生产者出现死锁

php - Codeigniter 方法将所有发布的值保存在二维数组中

php - 以编程方式从php数组创建具有不同背景颜色的div