文章目录
1,进程创建fork(),获取当前进程的进程号getpid()
#include <unistd.h>
pid_t fork(void);
- 创建新的进程,失败时返回-1
- 成功时父进程返回子进程的进程号,子进程返回0
- 通过fork的返回值区分父进程和子进程
进程创建fork()示例,getpid()
pid_t pid;
if ((pid = fork()) < 0)
{
perror(“fork”);
return -1;
}
else if (pid == 0)
{
printf(“child process : my pid is %d\n”, getpid());
}
else
{
printf(“parent process : my pid is %d\n”, getpid());
}
2,父子进程
- 子进程继承了父进程的内容:代码、数据、系统数据
- 父子进程有独立的地址空间,互不影响
- 若父进程先结束
·子进程成为孤儿进程,被init进程收养(init进程是Linux内核启动后创建的以一个用户级进程,进程号为1)
·子进程变成后台进程 - 若子进程先结束
·父进程如果没有及时回收,子进程变成僵尸进程 - 系统规定,每个进程结束时,必须由其父进程回收
子进程从何处开始运行?
- 父进程从main函数开始运行
- 子进程从fork()的下一条语句(下一条指令)开始执行。(父进程执行到fork()时,PC中存放的是fork()的下一条指令的地址,而子进程继承了父进程,也是从fork()的下一条指令开始执行,子进程并没有执行fork())
父子进程谁先执行?
- 不确定,内核先调度子进程,子进程就先执行;内核先调度父进程,父进程就先执行
- 一般来说,父进程创建完fork()后,如果时间片没有用完,通常会先执行父进程,父进程的时间片用完后,子进程就会被调度,再执行
父进程能否多次调用fork()?子进程呢?
- 理论上父进程没有限制,父进程可以多次调用fork(),创建多个子进程,但是需要考虑这些子进程的回收
- 子进程同样可以调用fork(),子进程创建的子进程叫孙进程。看程序应用的需求
3,进程结束 exit()/_exit()
#include <stdlib.h>
#include <unistd.h>
void exit(int status);//<stdlib.h>
void _exit(int status);//<unistd.h>
- 结束当前的进程并将status(低八位的值)返回
- exit结束进程时会刷新(流)缓冲区,_exit结束进程时不会刷新(流)缓冲区
进程结束exit()示例
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf(“this process will exit\n”);//标准输出是行缓冲,字符串末尾有换行符,此时字符串写到了标准输出的缓冲区里,遇到了换行符,会刷新流缓冲区,并输出
printf(“this is the end”);//标准输出是行缓冲,字符串末尾没有换行符,此时只是将字符串写到了标准输出的缓冲区里,并没有输出
exit(0);//程序结束时会刷新流缓冲区,将缓冲区中的内容输出到终端
printf(“never be displayed”);
}
this process will exitlinux@linux:~/test/process$ vi a.c
linux@linux:~/test/process$ gcc a.c
linux@linux:~/test/process$ ./a.out
this process will exit
this is the endlinux@linux:~/test/process$
进程结束_exit()示例
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
printf(“this process will exit\n”);//标准输出是行缓冲,字符串末尾有换行符,此时字符串写到了标准输出的缓冲区里,遇到了换行符,会刷新流缓冲区,并输出
printf(“this is the end”);//标准输出是行缓冲,字符串末尾没有换行符,此时只是将字符串写到了标准输出的缓冲区里,并没有输出
exit(0);//程序结束时不会刷新流缓冲区
printf("never be displayed");
return 0;
}
this is the endlinux@linux:~/test/process$ vi a.c
linux@linux:~/test/process$ gcc a.c
linux@linux:~/test/process$ ./a.out
this process will exit