进程基础(一)
进程指正在运行的程序,如下图示,是资源分配的最小单位,可以通过“ps ”或“top”等命令查看正在运行的进程,线程是系统的最小调度单位,一个进程可以拥有多个线程,同一进程里的线程可以共享此进程的同一资源。
![](https://i-blog.csdnimg.cn/blog_migrate/1cacdb5308c2f7f9a29c53beced5d3c1.png)
每个进程都有一个唯一的标识符,即进程 ID,简称 pid 。进程间的通信的几种方法?
管道通信:有名管道,无名管道。
信号通信:信号的发送,信号的接收,信号的处理。
IPC通信:共享内存,消息队列,信号灯。
Socket通信。
进程的三中基本状态以及转换:
![](https://i-blog.csdnimg.cn/blog_migrate/0e9a8422356d28724f9f64cbbc771431.png)
进程创建
所有的进程都是由其他进程创建(除了 pid 为 0 号的 idle 进程),pid 号为1 的init 进程是系统启动后运行的第一个进程,是所有进程的父进程,init 进程会初始化一部分系统服务,创建其他进程。
创建新进程的那个进程称为父进程,新进程称为子进程,父进程和子进程拥有相同的代码段数据段,有各自独立的地址空间。采用写时拷贝技术,即创建的新进程不会立即把父进程的资源空间复制过来,只有在修改时才会复制资源,另外父进程挂起的信号和文件锁不会被子进程继承。
子进程结束后,它的父进程要回收它的资源,否则就会成为僵尸进程 。
如果父进程先结束,子进程会被 init 进程收养,称为孤儿进程。
创建进程常用的函数定义如下:
头文件 | #include <sys/types.h> #include <unistd.h> |
函数 | pid_t getpid(void); |
返回值 | PID 号 |
功能 | 获取此进程 PID |
头文件 | #include <sys/types.h> #include <unistd.h> |
函数 | pid_t getppid(void); |
返回值 | PID 号 |
功能 | 获取父进程 PID |
头文件 | #include <unistd.h> |
函数 | pid_t fork(void); |
返回值 | 调用成功父进程返回子进程号,子进程返回 0,失败返回-1。 |
功能 | 系统调用,创建一个进程 |
// 在父进程中创建子进程
#include <stdio.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
pid = fork();
if (pid < 0)
{
printf("fork is error \n");
return -1;
}
//父进程
if (pid > 0)
{
printf("This is parent,parent pid is %d\n", getpid());
}
//子进程
if (pid == 0)
{
printf("This is child,child pid is %d,parent pid is %d\n", getpid(), getppid());
}
return 0;
}
运行结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/f39d848c6a676fc76b61d81c7592e2de.png)