PHP 进程互斥:进程结束时信号量为何未被阻塞?

云游道人 2024-11-12 607 阅读 0评论

问题描述

下列 php 代码实现了进程互斥:

<?php
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);

$file = "/www/tp/signal.txt";
$key  = ftok($file"x");
$semaphore = sem_get($file, 1, 0666, false);
sem_acquire($semaphore);
echo "hello world";
sleep(20);

问题:两个进程同时运行该代码,第一个进程结束时,为何第二个进程没有被阻塞,反而获取了信号量?进程结束时是否主动释放信号量?

问题解答

按照 php 手册中 sem_acquire() 函数的说明,该函数在默认情况下会阻塞线程,直到获取到信号量为止。然而,该文档也指出:

处理请求后,进程获取但未明确释放的任何信号量将自动释放,并会触发警告。 因此,在 php 中,进程结束时会自动释放其持有的信号量。这是因为当进程终止时,它不再需要使用这些信号量。操作系统级方法中,sem_close() 函数也有类似说明:

所有打开命名的信号量会在进程终止或执行 execve(2) 时自动关闭。

总结

在给定的 php 代码中,当第一个进程结束时,它持有的信号量会自动释放。因此,第二个进程可以获取释放的信号量,继续执行而不会被阻塞。


喜欢就支持以下吧
点赞 0

发表评论

快捷回复: 表情:
aoman baiyan bishi bizui cahan ciya dabing daku deyi doge fadai fanu fendou ganga guzhang haixiu hanxiao zuohengheng zhuakuang zhouma zhemo zhayanjian zaijian yun youhengheng yiwen yinxian xu xieyanxiao xiaoku xiaojiujie xia wunai wozuimei weixiao weiqu tuosai tu touxiao tiaopi shui se saorao qiudale qinqin qiaoda piezui penxue nanguo liulei liuhan lenghan leiben kun kuaikule ku koubi kelian keai jingya jingxi jingkong jie huaixiao haqian aini OK qiang quantou shengli woshou gouyin baoquan aixin bangbangtang xiaoyanger xigua hexie pijiu lanqiu juhua hecai haobang caidao baojin chi dan kulou shuai shouqiang yangtuo youling
提交
评论列表 (有 0 条评论, 607人围观)

最近发表

热门文章

最新留言

热门推荐

标签列表