橙色
01、进程退出
由下图可以看出,标准c库的exit函数比Linux的系统函数_exit多做了两件事情。
执行如下的代码,可得结果如下图,可以看到,hello和world都被打印了出来,但因为world后面没有换行符,所以world后面紧跟了新的命令行。
/*
#include <stdlib.h>
void exit(int status);
#include <unistd.h>
void _exit(int status);
status参数:是进程退出时的一个状态信息。父进程回收子进程资源的时候可以获取到。
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
printf("hello\n");
printf("world");
exit(0);
// _exit(0);
return 0;
}
而如果使用上述代码中第二个带下划线的exit,则会得到如下结果,只打印了hello而没有打印world。为什么会这样呢?因为printf是c语言标准库函数,hello后面跟有换行符\n,所以会自动刷新I/O缓冲区,输出hello。但world后面没有换行符,所以world在被送入I/O缓冲区后,因为上面提到了_exit()函数停止进程并不会刷新I/O缓冲区,所以world没有被打印出来
02、孤儿进程
为什么要设置为init呢?因为父进程有义务在子进程结束后回收子进程
下面来演示一下子进程,代码及结果图如下
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main() {
// 创建子进程
pid_t pid = fork();
// 判断是父进程还是子进程
if(pid > 0) {
printf("i am parent process, pid : %d, ppid : %d\n", getpid(), getppid());
} else if(pid == 0) {
sleep(1);
// 当前是子进程
printf("i am child process, pid : %d, ppid : %d\n", getpid(),getppid());
}
// for循环
for(int i = 0; i < 3; i++) {
printf("i : %d , pid : %d\n", i , getpid());
}
return 0;
}
为什么i am child
会出现在前台呢?因为系统默在处理进程时会切换到后台,处理完进程后就会返回前台,没想到还有一个孤儿进程继续在执行,所以就出现了打印的语句在前台的情况。
03、僵尸进程
wait()函数和waitpid()函数会在下一张中介绍。