当前位置:网站首页>php进程间传递文件描述符
php进程间传递文件描述符
2022-06-25 22:05:00 【ndrandy】
进程间传递文件描述符有什么实际应用场景呢?
- 最近看到golang中关于服务器平滑热重启reload时,需要长链接不被断开,需要fork一个子进程出来,然后把父进程的所有socket的文件 描述符(即:所有hold的客户端连接)都传递到子进程。在没研究linux进程间传递文件描述符之前,我的脑海里只有fork时,发生copy-on-write,父子进程间直接就可以共享连接fd了,但是这个时候,如果父进程退出,那所有的连接也被掐断了,因为父子进程共享连接资源了。所以需要将fd关联到的资源完整的clone到子进程中,使得父子进程对应的fd完全脱离关系,不过fd从父进程copy到子进程之后,想要fd值(int)都保持一致,不太可能,因为子进程要重新分配fd的。
如何实现进程间传递fd呢?
- 大概就是通过unixsockt,一端sendmsg, 另外一端recvmsg,但是不是简单的传输消息内容,需要告诉内核传输的是文件描述符 SCM_RIGHTS。 下面直接给出php版本的demo
<?php
$fds = [];
$ret = socket_create_pair(AF_UNIX, SOCK_DGRAM, 0, $fds);
if (!$ret) {
exit(socket_strerror(socket_last_error()));
}
$pid = pcntl_fork();
if ($pid > 0) {
socket_close($fds[0]);
$handle = fopen(__DIR__ . '/atomic.txt', 'a+');
var_dump($handle);
socket_sendmsg($fds[1], [
'control' => [
[
'level' => SOL_SOCKET,
'type' => SCM_RIGHTS,
'data' => [$handle]
]
]
], 0);
sleep(1);
} else {
socket_close($fds[1]);
$data = [
'controllen' => socket_cmsg_space(SOL_SOCKET, SCM_RIGHTS, 1)
];
$result = socket_recvmsg($fds[0], $data, 0);
var_dump("recv ok\n");
var_dump($data['control'][0]['data'][0]);
fwrite($data['control'][0]['data'][0], 'passing fd in PHP' . PHP_EOL);
}上述代码中,父进程var_dump($handle),和子进程var_dump($data['control'][0]['data'][0]); 两次打印的resource资源类型int值已经变化了,说明fd已经完整clone过去,父进程退出,也不会影响子进程的这个fd了。
边栏推荐
猜你喜欢

idea 查看单元测试覆盖率
![Classic image segmentation network: UNET supports libtorch deployment reasoning [with code]](/img/3a/fb3bfe673db5123e3124404f3905c0.png)
Classic image segmentation network: UNET supports libtorch deployment reasoning [with code]

如何进行流程创新,以最经济的方式提升产品体验?

The software test interview has been suspended. The interviewer always says that the logical thinking is chaotic. What should I do?

Qtcreator formatting code

Gradle的环境安装与配置

二进制、16进制、大端小端

28 rounds of interviews with 10 companies in two and a half years (including byte, pinduoduo, meituan, Didi...)

森林的先序和中序遍历

hiberate实体类CURD、事务操作汇总
随机推荐
51 single chip microcomputer, some registers, some knowledge points
中序线索二叉树
提取系统apk
A. Balance the Bits--Codeforces Round #712 (Div. 1)
MySQL自定义函数实例
php性能优化
Blob
平衡二叉树AVL
idea 查看单元测试覆盖率
Uniapp -- framework arrangement and analysis summary
发送邮件工具类
C# IO Stream 流(一)基础概念_基本定义
Gradle的环境安装与配置
String对象(常量)池
后序线索二叉树
How does excel translate Chinese words into English automatically? This formula teaches you
Px4 simulation basis
自定义QComboBox下拉框,右对齐显示,下拉列表滑动操作
OpenResty篇01-入门简介和安装配置
Screen recording to GIF is an easy-to-use gadget, screentogif, which is free and easy to use!