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