一、进程
1.1什么是进程
进程与程序的区别:
程序:
静态的,存储在磁盘上的指令的有序集合
进程:
正在运行的程序,动态的,创建进程,进程运行,进程消亡.进程是资源分配的最小单位
Linux为了更好的管理进程,每个进程都有独立的资源空间 (4G ---->虚拟资源空间),
资源空间分为两部分:1G内核空间资源和3G用户空间资源
内核空间资源:这部分资源在进程退出时,必须由另一个进程(父进程)来回收该资源,否则该进程成为僵尸进程
用户空间资源:堆区,栈区,全局区,常量区,数据段,代码段等 当进程退出时,该资源会自动释放
1.2如何查看进程
Windows: ctrl+alt+Del
linux:ps -aux
ps -ef
top
pstree
kill -l
1.3进程的分类
(1)交互进程 (既可以在前台运行,也可以在后台运行)
(2)批处理进程(一般不接触,不做介绍)gcc编译器
(3)守护进程
1.特点:
(1).守护进程,也就是通常所说的Daemon进程,是Linux三种进程之一,通常在系统启动时运行,在系统关闭时结束.
(2).始终运行在后台,后台服务进程
(3).独立于任何终端(和终端无关)。
(4).周期性地执行某种任务或等待处理特定事件。
2.会话
Linux是以会话(session),进程组的方式管理进程.每个进程属于一个进程组,子进程同属于该进程组.
会话是由一个或者多个进程组的集合,通常用户打开一个终端,系统就会创建一个会话,所有通过该终端运行都属于这个会话,shell进程--->会话组的组长,一个会话最多打开一个控制终端,当控制终端结束时,所有的进程也跟着结束。
3.创建守护进程
(1)创建子进程,父进程退出 fork()
(2)创建新的会话 setsid()
(3)修改工作目录 chdir()
(4)修改文件掩码 umask()
(5)关闭从父进程继承下来的文件描述符
int i=0;
for(i=0;i<getdtablesize();i++)
{
close(i);
}
(6)周期性的执行某种任务
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
int main()
{
//1.创建子进程,父进程退出fork()
//2.创建新的会话 setsid()
//3.修改文件目录 chdir()
//4.修改文件掩码 umask()
//5.关闭从父进程继承下来的文件描述符 getdtablesize()
//6.周期性的每隔5秒写入你的系统时间
//1.创建子进程,父进程退出fork()
pid_t pid;
pid=fork();
if(pid<0)
{
perror("fork error");
return -1;
}
else if(pid>0)
{
exit(0);
}
//2.创建新的对话
if(setsid()<0)
{
perror("setsid error");
return -1;
}
//3.修改文件目录
chdir("/tmp");
//4.修改文件掩码 umask()
umask(0);
//5.关闭从父进程继承下来的文件描述符 getdtablesize()
int i=0;
for(i=0;i<getdtablesize();i++)
{
close(i);
}
//6.周期性的每隔5秒写入你的系统时间
while(1)
{
system("date >> 2.txt");
sleep(5);
}
return 0;
}
1.4进程的状态
1.运行态/就绪态: 进程正在运行,或者准备运行 R running or runnable (on run queue)
2.等待态(阻塞态): 进程在等待一个事件的发生或某种系统资源
可中断的等待态 S
不可中断的等待态 D
3.停止态 进程被中断 T
4.死亡态 X (僵尸态Z) 已终止进程,但内核空间资源没有被回收,僵尸态
1.5进程的相关函数
1.进程的创建
(1)用fork() 创建
子进程几乎复制了父进程所有的资源,如栈区,堆区,数据段,
(2)用vfork()创建
vfork也创建新进程,但不产生父进程的副本, 它通过允许父子进程可访问相同物理内存从而伪装了对进程地址空间的真实拷贝,当子进程需要改变内存中数据时才拷贝父进程。这就是著名的“写操作时拷贝”(copy-on-write)技术
fork和vfork区别:
1.数据段不同
fork(): 子进程拷贝父进程的数据段,代码段
vfork():子进程与父进程共享数据段.
2.执行次序不同
fork(): 父子进程的执行次序不确定.
vfork():保证子进程先运行,在调用exec或exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行。
父子进程:
(1).父子进程执行顺序不确定,看内核的调度