目录
系统调用 API
参考:用时现查
通过 glibc 提供的库函数、使用 syscall 直接调用、通过 int 指令陷入;popen() 函数、fgets() 函数、system() 函数、strstr() 函数。
system()函数先调用fork(),然后再调用exec()来执行用户的登录shell,通过它来查找可执行文件的命令并分析参数,最后它么使用wait()函数族之一来等待子进程的结束。函数popen()和函数system()相似,不同的是它调用pipe()函数创建一个管道,通过它来完成程序的标准输入和标准输出。这两个函数是为那些不太勤快的程序员设计的,在效率和安全方面都有相当的缺陷,在可能的情况下,应该尽量避免。
创建守护进程
参考:用时现查
-
Linux应用程序中出现两次fork的解释leng_que的博客-CSDN博客linux 两次fork,如果一个进程fork一个子进程,但不要它等待子进程终止,也不希望子进程处于僵尸状态直到父进程终止,实现这一要求的技巧是调用fork两次。
-
【Linux】如何创建daemon进程&fork一次和fork两次有什么区别_pointer_y的博客-CSDN博客。
守护进程 它运行在后台,很重要,Linux下大多数服务器就是用守护进程实现的。因为它独立于终端运行,也就是说它的运行不受当前登录或者注销的影响,自成会话,周期性的执行某项任务或者等待处理某些事件。
创建守护进程:法1:两次 fork();法2:调用 daemon() 函数来创建。
-
etc.
创建守护进程 即 编写一个常驻内存的程序。
对于 在 shell 中启动一个程序,把一个程序放到后台去执行:我们只要在命令后面加上
&
符号,SHELL 就会把我们的 程序放到后台去运行的。对于编写程序:这里是 一次 fork() 的方法(父进程终止,子进程进入后台),还有两次 fork() 的方法(父进程运行,子进程终止,孙进程进入后台)
后台进程的创建思想:首先父进程创建一个子进程,然后子进程杀死父进程,这样子进程成为孤儿进程 / 被过继给 init 进程 / 成为后台任务,任务处理的工作由子进程来处理(终止父进程:
kill(getppid(),SIGTERM);
)。
暂 总结有四种常用方法:
-
shell 中启动一个程序 最后 加
&
标识符 将其放入后台执行。 -
一次 fork() 的方法(父进程终止,子进程进入后台)。
-
两次 fork() 的方法(父进程运行,子进程终止,孙进程进入后台)。
-
使用 daemon() 函数,
int daemon (int nochdir, int noclose);
,数:nochdir 非 0 表示不会将工作目录改为根目录,noclose 非 0 表示不会关闭所有打开的文件描述符,通常均设置为 0,成功则返回 0,失败返回 -1 并设置 errno 值。
高级进程管理
可参考:
-
《Linux System Prorgrammin》。
-
Linux系统编程 _ 中文版 _ by _ 哈工大(翻译)。
-
.etc
内容包括:
-
进程调度。
-
让出处理器。
-
进程优先级。
-
处理器亲和度(讨论多进程在多处理器间的 平衡/均衡 问题)。
-
实时系统(Linux 的一些实时性的支持,主要包括设置调度策略、设置优先级等)。
-
资源限制。
参考专业书即可,用时现查。进程的高级编程 比较专业了,看来很吃对系统的理解和经验等等。