启动
1.system函数
int system (const char *string);
2.exec系列函数
#include <unistd.h>
char **environ;
int execl (const char *path, const char *arg0, ..., (char*)0);
int execlp(const char *file, const char *arg0, ..., (char*)0);
int execle(const char *path, const char *arg0, ..., (char*)0, char *const envp[]);
int execv (const char *path, char *const argv[]);
int execvp(cosnt char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
3.fork函数
pid_t fork();
总结——三种启动新进程方法的比较
首先是最简单的system函数,它需要启动新的shell并在新的shell是执行子进程,所以对环境的依赖较大,而且效率也不高。同时system函数要等待子进程的返回才能执行下面的语句。
exec系统函数是用新的进程来替换原先的进程,效率较高,但是它不会返回到原先的进程,也就是说在exec函数后面的所以代码都不会被执行,除非exec调用失败。然而exec启动的新进程继承了原进程的许多特性,在原进程中已打开的文件描述符在新进程中仍将保持打开,但需要注意,任何在原进程中已打开的目录流都将在新进程中被关闭。
fork则是用当前的进程来复制出一个新的进程,新进程与原进程一模一样,执行的代码也完全相同,但新进程有自己的数据空间、环境变量和文件描述符,我们通常根据fork函数的返回值来确定当前的进程是子进程还是父进程,即它并不像exec那样并不返回,而是返回一个pid_t的值用于判断,我们还可以继续执行fork后面的代码。感觉用fork与exec系列函数就能创建很多需的进程。
管理
与操作系统原理相关
进程管理:进程状态和进程状态转换
进程管理:进程创建、进程删除、进程阻塞、进程唤醒
进程管理:父子进程的关系和区别
进程管理:进程中的内存管理
进程管理:用户进程、内核进程、用户线程、内核线程的关系区别
进程管理:线程的特征和实现机制
进程调度:进程调度算法
操作系统原理之外
页面换入换出的内核线程实现技术
父子进程数据共享实现
通用的调度器框架
进程切换的实现细节
通信
传统的进程间通信方式UNIX IPC(InterProcess Communication)
无名管道(pipe)
有名管道(fifo)
信号(signal)
System V IPC对象
共享内存(share memory)
消息队列(message queue)
信号灯(semaphore)
BSD
套接字(socket)