1.
内核调度器:分配进程时间
进程标志符:进程的身份证号
进程控制块:进程的描述、控制、资源信息
状态:执行,就绪,等待
用到的一些命令:
ps -aux
jobs
fg
ctrl +z
bg
&
pkill
kill -9 进程号
nice
读取id函数:
getpid()
getppid()
getuid()
geteuid()
getgid()
getegid()
2.进程的创建:
2.1
int system(const char *str);
//调用shell来执行str命令,命令执行完后继续下面的指令
2.2
pid_t fork(void);
返回值pid_t==0:表示子进程
返回值pid_t>0:表示父进程
返回值pid_t<0:表示创建失败
子进程继承父进程的地址空间,拥有独立的进程号、计时器、资源使用等。
执行:子进程和父进程都在fork函数处继续往下执行。
2.3
exec函数:
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *file, char *const argv[], char *const envp[]);
file可以是执行文件名(环境变量中搜索)
argv[] = {"full path", "param1", ... NULL};//含有路径,最后以NULL结尾
envp[] = {"name = val", ... , NULL };
将第一个参数指定的程序,覆盖现有的进程空间。
可变参数个数,用NULL标记最后一个
2.4
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream); //等待新进程的结束
command为可执行文件的全路径和执行参数
type:r表示将popen返回的文件流作为新进程的标准输出流,
w表示将popen返回的文件流作为新进程的标准输入流,
相当于执行了command,和当前进程进行信息交换。
3.进程控制
孤儿进程:父进程先退出,子进程就是孤儿进程,此时被pid为1的init进程接管
僵尸进程:子进程先退出,则子进程资源部会清理,退出的子进程为僵尸进程。
3.1
pid_t wait(int *status);//等待一个子进程退出,返回子进程id
3.2
pid_t waitpid(pid_t pid, int *status, int options);
pid=-1:表示等待所有的子进程
status:子进程退出状态,
WIFEXITED(stat_val):子进程正常结束,是一个非0值
WEXITSTATUS(stat_val):对于WIFEXITED(stat_val)非0,用来获取退出码
options,:WNOHANG表示不阻塞,
3.3
进程终止:
return:
exit: 清理缓冲区,文件写入,释放资源
_exit: 不清理缓冲区,释放资源
abort:
终止信号:ctrl+c, ctrl+\等
4.守护进程
终端:系统与用户交流的界面
从终端开始运行的进程依赖终端,终端关闭,进程也关闭。
守护进程:脱离终端,后台运行
创建过程:
4.1忽略SIGCHLD信号signal(SIGCHLD,SIG_IGN),创建子进程,父进程退出,
4.2子进程创建新回话,让进程摆脱父进程的会话、进程组、终端控制。使用setsid()函数;
4.3切换到/目录chdir("/");
4.4重设文件掩码umask(0);
4.5关闭文件描述符,这样终端与守护进程的信息输出就不相互影响
4.6使用syslog函数,查看/var/log/message的内容。