LINUX操作系统借助于进程来管理计算机的软、硬件资源,支持多任务的并行执行。操作系统最核心的概念就是进程。
1.进程的概念
进程是操作系统资源分配的基本单位,是一个动态的实体,是程序的一次执行过程(运行中的程序)
程序是一些保存在硬盘上的可执行的代码。
线程在进程内部,它是比进程更小的能独立运行的基本单位,基本不占用系统资源。进程在执行过程中拥有独立的内存单元,其内部的线程共享这些内存。一个线程可以创建另一个线程,同一个进程中的多个线程并行执行。
2.进程的标识
每一个进程都是通过唯一的进程ID(非负数)标识的。
pid_t getpid(id) 获得进程ID
pid_t geppid(id) 获得父进程ID
pid_t getuid() 进程的实际用户ID
pid_t geteuid() 进程的有效用户ID
pid_t getgid() 进程的实际组ID
pid_t getugid(id) 进程的有效组ID
3.进程的结构组成
代码段:存放程序的可执行代码
数据段:存放程序的全局变量、常量、静态变量
堆栈段:堆区用于存放动态分配的内存变量,栈区用于函数调用,存放函数的参数、函数内部定义的局部变量
4.进程状态
(1)R 运行状态
(2)S 可中断等待状态:进程可以在等待过程中可以被信号或定时器唤醒
(3)D 不可中断等待状态:进程可以在等待过程中不可以被信号或定时器唤醒
(4)Z 僵死状态:进程已终止,但进程描述符依然存在,直到父进程调用wait()函数后释放
(5)T 停止状态:收到SIGSTOP\SIGTOU等信号停止运行或者该进程正在被追踪
可用ps命令查看当前状态
5.进程的控制
fork:用于创建一个新进程
exit:终止进程
exec:执行一个应用程序
wait:将父进程挂起,等待子进程终止
nice:改变进程的优先级
举例:用fork建立进程
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t pid;
printf("Hello!\n ");
int i=1;
for(i=1;i<=5;i++)
{
pid=fork();
if(-1== pid)
{
perror("fork error");
return -1;
}
else if(0 == pid)
{
printf("I am kid %d ",i);
break;
}
}
if(i<=5)
printf("%u\n",pid);
else
printf("parents\n");
return 0;
}