进程

来源:互联网 发布:电子表格相同数据合并 编辑:程序博客网 时间:2024/06/08 01:13

一.基本概念

1.进程
用户角度:来看是应用程序的一个执行过程
操作系统角度:分配的内存,CPU时间片等资源的资本单位,为正在运行的程 序提供运行的环境。
.2进程与程序的区别:
进程动态,程序静态;

进程有一定的生命周期,而程序是指令的集合,没有建立进程的程序不能作为1个独立单位得到操作系统的认可。
一个进程只能对应一个程序,一个程序可以对应多个进程。
3.进程的产生过程
复制其父进程的环境配置;
在内核中建立进程结构;
将结构插入进程列表,便于维护;
分配资源给此进程;
复制父进程的内存影射信息;
管理文件描述符和链接点;
通知父进程;
4.进程之间的通信:管道,共享内存,消息队列
管道通信:利用内核在两个进程之间建立通道,类似与文件的操作,在管道的一端只读,另一端只写,利用读写的方式在管道之间传输数据。
共享内存:将内存中的一段地址,在多个进程之间分享,多个进程通过得到的共享内存的地址来直接对内存进行操作。
消息队列:在内核中建立一个链表,发送方按照一定的标识将数据发送到内核中,内核将其放入量表后,等待接受方的请求接受方发送请求后,内核按照消息的标识,从内核中将消息从列表中摘下,传递给接受方。(消息队列是一种异步操作方式)
5.进程之间的同步
多个进程之间需要协作完成任务时,经常发生任务之间的依赖现象,从而出现进程之间的同步问题,同步方式主要有消息队列,信号量(信号量是一个共享的表示数量的值,用于多个进程之间的操作或共享资源的保护,是进程间通信的主要方式)等。

二.进程产生的方式
1.getpid();getppid()
pid_t getpid(void);返回当前进程的ID号;
pid_t getppid(void);返回当前进程的父进程的ID号;
2.fork()函数:   pid_t fork(void);
特点:调1返2,复制相同的私有内存;
独立私有内存空间;
并发;(并发:不同时,先后顺序不一定;并行:同时执行);
共享文件;
父进程返回子进程的ID号,而子进程返回0.
查看:
pstree:查看进程树
size fork:查看进程内存段大小
readelf -S fork:查看文件内存分布图(起始位置以及大小)
ps会替换原来的文件

3.标准C:system()函数:
system() 函数调用shell的外部命令在当前进程中开始另外一个进程
int system(const char *command)
执行system()函数时,会调用fork(),execve(),waitpid()等函数,其中任意一个函数调用 失败,将导致system()函数调用失败
失败,返回-1;当sh不能执行时,返回127;成功,返回进程状态值
4.exec函数()系列:
fork()函数和system()函数,系统都会建立一个新的进程,执行调用者的操作,而原来的进程还会存在,知道用户退出;而exec()族函数与两者不同的是,exec()族函数会用新进程代替原有的进程,系统会从新的进程运行,新的PID值与原有的PID值相同。
#include <unistd.h>
extern char **environ
execv(const char* path,const char *argv[])  //v:数组
execvp(const char* file,const char *argv[]) //
execle(const char* path,const char *arg,...,char *const envp[]) //
execl(const char* path,const char *arg);
execlp(const char* file,const char *arg,...)
exec()函数族执行成功后不会返回,执行成功后已经占用了当前的空间和资源(代码段,数据段,堆栈等);他们的进程ID还是原来的进程ID,即在原来进程的壳上执行了自己的程序,失败返回-1.

三.结束进程
reurn -1;非正常退出
return 1;出错退出
return 0;成功退出
echo$? //打印程序退出的返回值
调用exit()(系统会回收资源)
exit(EXIT_SUCCES);
exit(EXIT_FAILURE);
调用_exit()(系统不回收资源)
exit 0;
exit 1;
调用abort()
强行终止,生成dump文件说明结束信
信号终止:sigkill
sigstop
 
四.停止进程
休眠sleep()
printf("\r%d",i+);
(\r:回车\n:换行)
fflush(stdout);
sleep(1);

暂停:pause()返回-1,不给命令不会节结束
忽略信号2:signal(2,SIG_IGN)
  (利用回调函数实现)

等待:wait(NULL) //防止僵尸进程
等待子进程结束,回收资源
返回子进程的ID,僵尸进程:子进程退出,父进程没有获取子进程的信息状态
孤儿进程:父进程先于子进程退出,有父进程的父进程进行回收资源
init进程作为新的父进程
 

 

原创粉丝点击