LINUX系统编程之进程
一、操作系统职责:管理所有的资源,将不同的设备和不同的程序关联起来。
二、系统调用是操作系统提供给用户程序的一组特殊函数接口,用户程序可以通过这组接口获得系统内核提供的服务,例如:打开文件,关闭文件,读写文件。
三、POSIX(Portable Operation System interface)
Linux中,应用程序编程接口(API)遵循POSIX标准,用于保证应用程序可以在源代码一级上在多种操作系统上移植运行。
四、系统调用按功能逻辑可分为:进程控制、进程间通信、文件系统控制、系统控制、内存管理、网络管理、socket控制、用户管理。
通常用一个负的返回值表明错误,0值表明成功可用perror打印出错信息
五、进程
程序:可执行文件(静态),进程:程序的执行实例(动态)
进程的状态:创建,调度,消亡
进程拥有自己的环境和资源
用exec函数将程序由内核读入内存使其执行起来成为一个进程
六、进程的生命周期
创建
调度
就绪态:已具备执行条件,等待分配CPU时间
执行态:正在占用CPU
等待态:不具备某些执行条件,无法继续执行
消亡
七、PCB(进程控制块)
OS根据PCB对并发执行的进程进行控制和管理,系统在创建一个进程时会开辟一段内存空间存放与此进程相关的PCB数据结构
PCB中记录了用于描述进程进展情况及控制进程运行所需的全部信息。
PCB是进程存在的唯一标志,linux中PCB存放在task_struct结构体中,打开/include/linux/sched.h可以找到task_struct 的定义
八、进程控制
进程号0~32767 0号调度进程 1号init进程
除调度进程外,所有进程都是由init进程直接或间接创建的
PID进程号getpid() PPID父进程号getppid() PGID进程组号getpgid()
九、文件描述符:以进程为单位分配0-1023最小可用的描述符
十、进程状态转换
CPU调度算法:优先级,先来先调度,短时间优先,时间片轮转
umask掩码,屏蔽文件权限
ps命令查看当前进程
十一、创建进程 fork() vfork()
1.fork()在子进程中返回0,在父进程中返回值大于0,调用fork()以后,源程序被复制了一份,两份程序中只有fork()返回值不一样,两份程序同时执行,顺序不定,父子进程物理地址不同,虚拟地址相同。
问:如果一个程序同时执行了三个fork(),它创建了几个进程
fork();1(0)
fork();2(0) 3(1)
fork();4(0) 5(1) 6(2) 7(3)
第一次调用,0号进程创建了1号进程
第二次调用,0号进程创建了2号进程,1号进程创建了3号进程
第三次调用,0号进程创建了4号进程,1号进程创建了5号进程,2号进程创建了6号进程,3号进程创建了7号进程
一共创建了2的n次方减一个进程
2.vfork()一般配合exec使用,子进程共用父进程地址空间,保证子进程先运行,调用exec或exit后父进程再运行
exec函数族是进程替换函数,将新的地址空间赋给原来的进程,进程号不变,新程序从main开始运行
exec只有失败才返回,exec后面的代码不执行
但注意exec是一个函数族,有execlp,execvp,execle,execve等
只能用exit()结束子进程,而return是返回到函数执行的首地址
atexit(void (*function)(void))注册退出处理函数
十二、输入输出缓冲区
系统调用无缓冲
标准IO库函数输入输出为行缓冲
标准IO库操作文件为全缓冲
十三、
僵尸进程:子进程结束而父进程未调用wait()或waitpid()回收其资源
孤儿进程:父进程结束而子进程未结束
守护进程:特殊的孤儿进程,脱离终端运行在后台
wait()/waitpid():等待子进程结束并回收其资源
用ps查看进程,kill+pid或pkill+进程名结束进程
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。