httpd

httpd 是 Apache 超文本传输协议 (HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池
Httpd 是由 ASF(apache software foundation)维护的开源项目之一也是目前最为流行的 web 服务器之一 

login

login:某用户由/bin/login 登陆进系统后启动的 shell,跟这个用户绑定。这个 shell 是用户登陆后启动的第一个进程。login 进程在启动 shell 时传递第 0 个參数指明 shell 的名字,该參数第一个字符为”-“,指明这是一个 login shell。对 bash 而言,启动參数为”-bash”。当 bash 以 login shell 启动时,它会运行/etc/profile 中的命令,然后/etc/profile 调用/etc/profile. d 文件夹下的全部脚本。然后运行~/. bash_profile。/. bash_profile 调用/. bashrc,最后~/. bashrc 又调用/etc/bashrc。
要识别一个 shell 是否为 login shell。仅仅需在该 shell 下运行 echo You can't use 'macro parameter character #' in math mode0: `#echo 0`
假设输出为该 shell 名字,加上一个’-‘前缀。则说明该 shell 为 login shell。比如-bash,-su 等等。实验一下。在本人的 Ubuntu 系统下。打开 Terminal,输入 echo $0,得到的是”bash”,说明这不是一个 login shell。而由 SSH 登陆到 server 上,运行相同命令。得到了”-bash”的结果,说明由 SSH 登陆的为 login shell

Shell 程序

shell 是一个交互型应用级程序,代表用户运行其他程序

Shell 程序示例:eval 函数


Parseline 函数解析以空格分隔的命令行参数,并构造传递给 execve 的 argv 向量
builtin_command函数检查第一个命令行参数是否是一个内置的shell命令
如果builtin_command返回0,shell创建一个子进程,并在子进程中执行所请求的程序
如果用户要求后台运行,则shell返回,等待下一个命令行;否则shell使用waitpid等待作业终止,作业终止时,shell开始下一轮迭代

shell 回收作业

  • 在这个例子中 shell 可以正确等待和回收前台作业
  • 但是后台作业呢?
    • 后台作业终止时会成为僵尸进程
    • 永远不会被回收,因为 shell 通常不会终止
    • 将导致内存泄漏
解决 shell 无法回收后台作业终止形成的僵尸进程
  • 异常控制流
    • 在后台进程完成时内核将中断正常处理程序提醒我们
    • 在 Unix 里这种提醒机制叫作信号