我在这里看到:https://httpd.apache.org/docs/current/invoking.html
“如果配置文件中指定的 Listen 默认为 80(或任何其他低于 1024 的端口),那么需要具有 root 权限才能启动 apache,以便它可以绑定到这个特权端口。
一旦服务器启动并执行了一些初步活动(例如打开其日志文件),它将启动几个子进程,这些子进程负责监听和响应来自客户端的请求。主 httpd 进程继续以 root 用户身份运行,但子进程以较低权限用户身份运行。"
问题是:子进程如何做到这一点?传入请求发生在主进程现在绑定的端口 80 上。
我猜想主进程将调用 bind() 调用,然后子进程可以针对绑定的套接字执行 listen() 调用?或者主服务器是否将传入的数据传递给子进程?
答案1
首先:https://httpd.apache.org/docs/current/invoking.html
- 子代继承了套接字
covener 说:“通常,子进程分叉后会继承监听套接字。它们要么都尝试调用 accept,要么争夺一个互斥锁并让其中一个进入 accept()”
下一个,
- 我找到了 Solaris 的子进程的 truss 输出
http://httpd.apache.org/docs/current/misc/perf-tuning.html
它还说:“...接受连接后,监听线程会唤醒工作线程来处理请求。”
为了完整性,由于它是一个监听器进程,我假设它已经执行了 listen()。该调用不在上面的 truss 输出中。