进程知识点

进程
概念:*****
一段具有独立功能的程序在某个数据集合上的一次运行的过程。
进程是操作系统分配资源的最小单位。
特点:
动态性、并发性、独立性、异步性
进程和程序的区别 **
进程是动态的,程序是静态的
进程是程序运行的过程,程序没有运行概念
进程是不能保存的,程序是保存在磁盘的指令的集合。
进程的分类
交互进程、批处理进程、守护进程
进程的状态****
就绪态、运行态、等待态、僵尸态、死亡态
介绍几个概念
孤儿进程:
父进程先于子进程结束,该子进程就是孤儿进程。
进程退出:
进程创建时分配内存,它是把父进程的内存复制一份给子进程。
进程退出时,父进程来回收内存。
进程收养
孤儿进程会被init进程收养。init的进程号是1。
僵尸进程
进程退出时,父进程不回收资源。应该避免出现僵尸进程。
进程号
正整数
进程号是唯一的。
内核中使用进程号来区分不同的进程。
创建进程
pid_t fork();
返回值:成功会返回两个值。父进程地址空间中返回大于0的值;子进程地址空间中返回0.
失败时,返回-1.
退出进程
main函数结束
发送信号
exit(int)/_exit(int)
区别:exit()会做清理工作,_exit()不做清理工作
main函数中写exit()和return 0效果几乎是一样的。
子函数中写exit()/_exit()和return效果不一样。
一般结束进程推荐使用exit(0);

等待子进程结束 
	pid_t wait(int *status);
		阻塞当前进程,用于等待它的任意一个子进程结束,
			子进程结束或者当前进程收到信号,等待结束.
	参数:
		status是一个整型指针,指向的对象用来保存子进程退出时的状态。  status若为空,表示忽略子进程退出时的状态  status若不为空,表示保存子进程退出时的状态另外,子进程的结束状态可由Linux中一些特定的宏来测定。
	返回值:成功时,返回退出的子进程的pid,失败时,返回-1.
	说明 :
		wait是一个阻塞函数,必须是等到某个子进程退出或者收到信号才会返回。
		一般情况下,会让它在当前进程结束的时候再调用。
		另外,也可以找一个替代函数waitpid
	pid_t waitpid(pid_t pid, int * status, int option);
	参数: 
		pid : 
			pid < -1: 等待其组ID等于pid的绝对值的任一子进程。 
			pid = -1:等待任何一个子进程退出,此时和wait作用一样
			pid = 0:等待其组ID等于调用进程的组ID的任一子进程。
			pid > 0:只等待进程ID等于pid的子进程,其它的不关心
		status:同wait的参数一样
		option :  0表示阻塞,WNOHANG表示不阻塞
	返回值:如果有进程结束,返回值为结束的子进程号;
			如果是WNOHANG不阻塞等待,并且没有子进程结束,返回0;失败时,返回-1。
	例: 
		waitpid( -231, NULL, 0 ); //阻塞等待PGID=231的任意一个子进程退出
		waitpid( -1, NULL, 0 );//和wait(NULL)一样
		waitpid( 0, NULL, 0 ); //阻塞等待PGID = getpgid()的任意一个子进程退出
		waitpid( 234, NULL, 0 ); //阻塞等待进程号为234的子进程退出。
	例: 
		waitpid( -1, &stutus, WNOHANG );			
exec函数族
	1. 什么时候用
		在一个进程中执行另外的一个可执行文件时,会用exec函数族。
		例: 
			第三方软件,无法得到源码,只能得到可执行文件时,
			在自己当前的进程中想办法调用exec函数族,直接执行该文件。
	2. 用它要注意什么
		当使用exec时,当前进程除了进程号外,其它都被替换。
		在exec之后的代码不能被执行。
		解决办法 :
			方法1:fork新的进程,在新的进程中调用exec;
			方法2:exec放在进程的最后进行执行
	3. 怎么用
		#include <unistd.h>
		int execl(const char *path, const char *arg, ...);
		int execv(const char *path, char *const argv[]);
		int execle(const char *path, const char *arg, ..., char *const envp[]);
		int execve(const char *path, char *const argv[], char *const envp[]);
		int execlp(const char *file, const char *arg, ...);
		int execvp(const char *file, char *const argv[]);
		这一组函数前四个字符都一样,只看后面的字符。
		l[list]:列写
			把可执行文件所需要的参数一个一个列写出来,最后以NULL为结尾
		v[vector]:数组
			把执行该文件所需要的命令和参数放在一个数组中,并且以NULL为结尾
		p[path]:路径
			使用系统自带的环境变量PATH,执行某个可执行文件时,会自动到$PATH所指路径查找文件。
		e[env]:环境变量
		参数: 
			path: 
				可执行文件的路径+文件名
			arg:执行该文件所需要的命令
		例: 
			ls --> path: /bin/ls
			   --> arg : ls , NULL
			execl( "/bin/ls", "ls", NULL );
		例:
			ls -l /dev 
			execl( "/bin/ls", "ls", "-l", "/dev", NULL );
		例: 
			cat exit.c 
			char * argv[] = {"cat", "exit.c", NULL};
			execv( "/bin/cat", argv );
		例:	
			ls -l /home/farsight 
			execlp( "ls", "ls", "-l", "/home/farsight", NULL );
			char * argv[] = {"ls", "-l", "/dev", NULL};
			execvp( "ls", argv );

内存分段
栈段
局部变量
参数
堆段
手动申请、手动释放
malloc/realloc/calloc/new free/delete
数据段
全局变量
静态变量
常量
代码段
编译好的二进制代码 – 只读
使用内存的原则
1. 小栈大堆
2. 谁申请谁释放
3. 局部变量的地址不能返回
以下概念
内存泄露
内存碎片
内存溢出
strncpy(p, q, size);


下载文件
网卡–文件
打开网卡这个文件
获取文件大小fileSize;
创建空洞文件/abc/def/a.mp3
while(fileSize > 0)
{
读网卡–》buf, 读取的长度是len
写buf的内容到本地的文件中
fileSize -= len;
}
关闭文件
关闭网卡

猜你喜欢

转载自blog.csdn.net/qq_43967317/article/details/107676034