一.IO与文件目录管理
1.pread=lseek+read
pread读取以后不改变读位置
2.mmap映射:
/proc/${PID}/men 无法映射
3.IO的有效用户与实际用户
默认情况:实际用户与有效用户是一致的
有效用户 effice
权限用户
实际用户 real
执行用户
getuid()与geteuid()返回一个整数uid_t
4.目录相关函数
chdir 切换目录
mkdir 创建目录
rmdir 删除目录
unlink 删除文件
umask 设置文件权限屏蔽位
stat 文件目录状态
5.目录的遍历
方法一opendir系列函数
readdir seekdir dirfd 传递参数目录文件描述符
返回dirent结构,保含目录名,目录类型,空目录
方法二scandir
int scandir(const char*dirname,//目录名
struct dirent***namelist,//返回目录列表
int (*)(strudt dirent*),//回调函数,用于过滤目录。回调函数:通过函数指针调用的函数
//unll不过滤
int (*)(struct*,structdirent*),//用于目录排序
//NULL不排序)
scandir返回目录个数
二.进程
1.什么是进程
执行的程序:代码,资源(包括内存),CPU
进程有很多数据维护:进程状态/进程属性
所有进程属性采用结构体维护:树形的数据结构
ps 查看进程常见属性+a所有进程+aue有效进程
进程的状态:
top查看系统进程执行状况,类似windows任务管理器,空格刷新,Q退出
pstree查看进程树,在unix中为ptree
kill向进程发送信号kill -s 信号 进程id
kill -l 显示进程能接受的所有信号
-1 表示所有进程
ulimited
2.创建进程
1.由代码加载到内存,分配CPU时间片
代码由独立的程序存在。
2.进程有关的创建函数,三个要素,代码,内存,CPU时间片
int system(const char*filename);建立独立进程,拥有独立的代码空间
等待新的进程执行执行完毕,system才返回(阻塞)。新进程的返回值与system的返回值有关系。
任务进程的返回值:不要超过255。一个字节。
system的返回值中8-15位存放返回码。即第二个字节中(Linux中宏WEXITSTATUS)。
案例:使用system调用一个程序。观察ID及阻塞。
使用system调用ls -l.ls-l home
popen:创建子进程,在父子进程之间建立一个管道,返回FILE*,用fileno可将之转化为一个文件描述符号。
案例:使用popen调用ls-l,并且建立一个管道读取输出。
exec系列函数
execl execlp
替换当前进程的代码空间中的代码数据
函数本身不创建新的进程。
int execl(const char*path,constchar*
第一个参数:替换的程序
第二个参数...:命令行
命令行格式:命令名 选项参数
命令行结尾必须是空字符串
案例:使用exec执行一个程序
体会execl的参数的命令行的格式,与excclp的区别(execl只认当前路径,execlp使用系统的搜索路径)
fork返回pit_t,创建进程。子进程复制父进程的代码和程序执行的位置。
在子进程不调用fork所以返回值=0,父子进程同时执行。
fork应用场景:使用fork实现多任务(UNIX系统本身不支持线程)
多任务的袦:1.进程2.线程3.信号4.异步5.进程池与线程池
4.理解进程
父子进程的关系:独立的二个进程,互为父子的关系。
父进程先结束,子进程依托根进程init:孤儿进程,孤儿进程没有任务危害。
子进程先结束,子进程会成为僵死进程。僵死进程不占用内存、CPU。但在进程任务树中占用一个节点。
僵死进程会造成进程名额资源浪费,所以要处理僵死进程。
僵死进程使用wait函数回收。是阻塞型。子进程结束时通常会发送一个信号SIGCHILD,父进程使用singal(int sig,void(*)(int))向系统注册,只要sig信号发生,系统停止进程,并调用第二个参数函数fun。当函数执行完毕,继续原来的进程。该方式称为软中断。
处理步骤一,实现回收处理函数。步骤二,使用singnal绑定信号与处理函数。
5.父子进程的资源访问
5.1内存资源
子进程复制父进程的全局区、局部区内存,子进程的虚拟地址重新映射的,映射是独立的。
换句话说,子进程复制整个内存区域,但内存区域指向不同的物理空间。即:尽管复制,但内存独立,不能相互访问。内存资源是相互独立。
这就导致多进程之间的数据交换(通信)问题(IPC)。
映射内存:MAP_SHARED:映射到同一物理空间, MAP_PRIVATE:映射到不同的物理内存
5.2文件资源
父子进程之间,文件描述符号指向的是同一个文件内核对象
结论:进程的数据交换,基于二种方式:内存(有序/无序)与内存(有序/无序)
有序内存:消息队列
无序内存:共享内存
有序文件:管道文件(有名/匿名)与SOCKET文件
无序文件:映射
都是基于内核对象:文件,内存,队列。
补充:
每个进程维护自己的描述符列表。
1.exit(状态码)返回状态码,被系统得到,系统根据状态码进行日志记录。
返回值被调用者得到,system/wait,程序根据程序返回的状态码进行对应的处理
exit(状态码)=main函数中的return 状态码。
2.状态码状态码的第二个字节才是exit的返回值或者return返回值。