进程的概念
进程:进程是一个程序在内存中执行的过程。进程由程序代码数据和进程控制块(简称pcb)组成
**进程控制块(PCB)**linux中的pcb是一个名叫task_struct 的结构体,其中有一下几个内容:
标识符:用来区别于其他的进程的标识符。
状态:任务状态,退出代码,退出信号等。
优先级:进程的优先级。
程序计数器:指令序列中下一条指令的地址。
内存指针:程序代码和其它和进程相关的指针。
上下文数据:进程执行时处理器寄存器中的数据。
其它信息。
linux中查看进程的指令ps -ef
查找指定的进程ps -ef | grep 【进程名】
进程的创建
fork()函数的实质是一个系统调用,其作用是创建一个新的进程,当一个进程调用它,完成后就出现两个几乎一模一样的进程(当然也可以不一样,根据初始参数或变量决定),其中由fork()创建的新进程被称为子进程,而原来的进程称为父进程.子进程是父进程的一个拷贝,即子进程从父进程得到了数据段和堆栈的拷贝,这些需要分配新的内存;而对于只读的代码段,通常使用共享内存方式进行访问。
fork()函数的返回值:
父进程返回子进程的ID,
子进程返回0
错误返回一个负值
这样我们就可以根据返回值的不同来确定父子进程,
那么是什么原因导致错误?
1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。
2)系统内存不足,这时errno的值被设置为ENOMEM。
fork()的简单应用
#include <unistd.h>
#include <stdio.h>
int main ()
{
pid_t fpid; //fpid表示fork函数返回的值
int count=0;
fpid=fork();
if (fpid < 0)
printf("error in fork!");
else if (fpid == 0) {
printf("i am the child process, my process id is %d/n",getpid()); //getpid()获取进程的标识符
count++;
}
else {
printf("i am the parent process, my process id is %d/n",getpid());
count++;
}
printf("统计结果是: %d/n",count);
return 0;
}
运行结果为
i am the child process, my process id is 5574
统计结果是: 1
i am the parent process, my process id is 5573
统计结果是: 1
## 进程状态
R运行状态:当进程正在被CPU执行,或已经准备就绪随时(进入运行队列里)可由调度程序执行,则称该进程为处于运行状态 。
S睡眠状态(可中断睡眠状态):就是进程在等待事件的完成,当系统产生一个中断或释放了进程正在等待的资源是会被唤醒。进入运行状态。
D磁盘休眠状态(不可中断睡眠状态):除了不会因为收到信号而被唤醒,该状态与可中断睡眠状态类似。但处于该状态 的进程只有被使用wake_up()函数明确唤醒时才能转换到可运行的就绪状态。该状态通常在进程需要不受干扰地等待或者所等待事件会很快发生时使用。
T停止状态:当进程收到信号SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU时就会进入暂停状 态。可向其发送SIGCONT信号让进程转换到可运行状态。进程在调试期间接收到任何信号均会进入该状态。
X死亡状态:仅仅是一个返回状态。
查看进程的基本指令
ps[参数]
2.命令功能:
用来显示当前进程的状态
3.命令参数:
a 显示所有进程
-a 显示同一终端下的所有程序
-A 显示所有进程
c 显示进程的真实名称
-N 反向选择
-e 等于“-A”
e 显示环境变量
f 显示程序间的关系
-H 显示树状结构
r 显示当前终端的进程
T 显示当前终端的所有程序
u 指定用户的所有进程
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程