导图社区 高级应用开发2
Revit二次开发高级应用(二)——怎样在Revit中使用多线程 1、 创建元素 在Revit中完全可以使用多线程,只是需要满足一定的规则:不改变Revit的Document文档的工作都可以在线程中...
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
高级应用开发2
任务编程--进程
进程 -- 动态的过程
ps aux--- linux中的进程
user pid %cpu %mem stat start command
pid --- 进程的编号(不连续)
程序和进程区别
程序:指令的集合,静态过程
进程是程序的一次执行过程,动态的。
进程的概念: 背过
1、独立可调度的活动
2、抽象的实体,申请和释放资源
3、并行执行,多进程提供基础
4、进程是程序的一次执行过程,动态的,程序执行和资源管理的最小单元。
进程的标识符
pid 子进程
ppid 父进程 父进程 --》 产生子进程 才会有父子关系
如果进程只有一个,就叫做进程。
进程的特性:
动态性 --- pid不连续,动态产生,动态消亡
并发性 --- 同时执行 -- 宏观
异步性 --- 不同时执行 -- 微观角度,时间差
独立性 --- 父子进程运行在不同的空间中
结构特性 --- 空间不同,所以具有不同的空间体系(栈,堆,数据,代码)
进程的状态
新建 就绪 运行 阻塞 结束 (三个回路)
父进程 -- 创建子进程
fork() -- 函数
pid_t fork()(无参数)
返回值:执行一次,返回2次
子进程中返回0 父进程中,返回子进程的pid>0 -1 --- error
getpid() --- 返回当前进程的pid
getppid() -- 子进程中返回父进程的编号
进程间的通信
进程间需要通信:IPC
ipc分类:
管道pipe FIFO
管道:类似水管,单向的,先进先出,无结构的字节流,
2个端口(fd[0] -- 读端,fd[1] -- 写端)队列形式,不支持seek.
通道(channel) --- 不能存数据
读和写都是管道末尾。
原理图
注意几点: 1、父子进程之间 2、从写端到读端(流向) 3、父子进程之间(管道的文件描述符继承过来的)
共享内存
共享内存 -- 创建内存,使用内存通信
在内核中创建一片物理内存,让多个进程访问。
查看共享内存:ipcs -m
键 --- 一个工程的唯一标识 shmid --- 共享内存段唯一表示 权限 --- 0600 字节 --- 共享内存段大小
编程步骤:
1、创建共享内存
1、创建共享内存 -- 符合共享内存的参数(键,shmid,权限,大小)
(1)int shmid = shmget(key_t key,size_t size,int shmflg);
①key -->ftok() -- 返回值获得
1)key_t key = ftok(const char*pathname,int pro_id);
a.pathname -- 存在,自己用户名(/home/lv1)
b.pro_id 工程编号 大于0
c.返回值:键值
②size --->共享内存大小
③shmflg --> IPC_CREAT|权限
①返回值:shmid --- >共享内存的标识符
2、映射共享内存
(1)void*addr = shmat(int shmid,NULL,0);
①NULL --- 让内核分配合适的地址
②0 -- 共享内存的可读可写
③返回值:addr -- 共享内存分配的地址
3、使用共享内存(物理地址,直接访问)
(1)memset (2)strcpy memcpy (3)puts printf
4、断开共享内存
(1)int shmdt(addr);---①addr -- 共享内存的地址 ②返回值 -- 0 success error -- -1
5、回收共享内存
(1)shmctl(shmid,int command,struct shmid_ds*buf);
①command: IPC_STAT IPC_SET IPC_RMID(删除) ②buf --- 共享内存信息结构体指针 ③0 --- success -1 -- error
消息队列
信号量
信号
socket通信
函数:
1、pipe --- 创建无名管道
(1)int pipe(int pfd[2]);
①pfd[2] -- 接收管道的描述符
②返回值:0 -- success -1 --- error
有名管道:特殊的文件,存在文件系统中,使用在不相关的进程间通信。 原理类似与pipe
mkfifo() --- 创建有名管道
int mkfifo(const char*pathname,mode_t mode);
pathname -- 文件名,路径名
mode -- 权限
返回值:0--- success -1 --- error
总结:
1、管道,单向的,不能存放数据,只是一个通道
2、效率低,重复的打开和关闭管道
3、读一端先阻塞,等待写入管道的末端。
标准流管道 --- 解析shell命令
函数
FILE* pfd = popen(const char*command,char*type) --
command --- shell命令的字符串
type -- 读写方式(r/w)
pfd --- 文件流指针 error - NULL