1.fork创建子进程时,先复制一份父进程,大部分数据都会被复制,但父进程会返回子进程的id,子进程返回0,以此区分
以umask举例,umask就是直接父进程后,直接输出自己的umask,如果创建一个0777权限的文件,因为要首先从父进程复制一份,然后0022会和0777进行一些处理(掩码,或非操作?)
2.情况分析:
父进程给子进程收尸
父进程死亡,子进程由孤儿院(初始进程,pid为1)收尸
产生子进程以后bash就会进入睡眠,等待子进程结束然后执行收尸操作
父进程和子进程谁先执行看cpu心情,o(* ̄︶ ̄*)o
3.eviron用setenv取得的环境变量改变不会影响原值,因为改变的只是子进程接住的变量罢了
4.bash的多操作多文件命令,多半是用了ecec族函数
5.shell重定向的逻辑:
ecec调用程序分配待操作文件描述符
然后重定向到目标流
关闭原文件描述符
ecec再次调用程序运行,此时原流已经被重定向为目标流
6.waitpid()可以用于父进程接收子进程的退出情况以及状态码,以此分析
7.管道
实质:建立一块内存空间以及两个文件描述符,分别表示读端和写端
特殊情况:因为两个端口分别对应 关闭 空 满 是否阻塞 所以会有多种特殊情况
8.共享内存
实现逻辑:
1.用户自定义序号并且序号通过哈希处理形成一个key值
2.key值在内核申请空间,与共享空间描述符(shmid)绑定,形成一个键值对,申请空间时和open创建文件类似,可以设置创建模式和权限
3.用户使用shmid在用户空间进行映射,映射地址(shmp)可以设置
4.对用户映射空间shmp进行操作,会被内核里的共享空间所保留
5.取消映射
6.第二个用户映射shmid时,shmid里的内容会映射到用户2的shmp里,这样,用户1操作就出现在了用户2
7.删除共享空间
9.消息队列
消息队列和IPC通信类似,消息队列通过结构体对消息进行了分类