学习 Linux高级编程05_A

一、IO与文件目录管理

         1.pread= lseek + read

                   pread读取以后不改变读写位置

         2.mmap映射:

                   /proc/${pid}/mem无法映射

         3.IO的有效用户与实际用户

                   su- 用户 (su-表示切换到这个新用户和新环境,如果不加-表示只切换用户不切换环境)

                   默认情况:实际用户与有效用户是一致的。

                   实际用户:执行用户

                   有效用户:权限用户

                   uid_tgetuid()

                   uid_tgeteuid()

         4.目录相关函数

                   chdir  切换目录

                   mkdir  创建目录

                   rmdir  删除目录

                   unlink删除文件

                   umask  设置文件权限屏蔽位

                   stat   文件目录状态

         5.目录的遍历

                   opendir系列函数

                   readdir

                   closedir

                   seekdir

                   dirfd

                  

                   scandir

                   intscandir(const char *dirname, //目录名

                                     structdirent ***namelist, //返回目录列表

                                     int(*)(structdirent*), //回调函数,过滤目录 NULL不过滤

                                     int(*)(structdirent*, struct dirent*) //排序返回目录 NULL不排序

                                     );

                                              

                   返回值:

                            >=0目录个数

                            ==-1 目录查找失败

二、进程

         1.什么是进程

                   执行的程序:代码->资源->CPU

                   进程有很多数据维护:进程状态(进程的属性)

                   所有进程属性采用的结构体(结构体任务树)维护->树形数据结构

                   ps查看进程常见属性

                   top查看系统进程执行状况(类似Windows中的任务管理器空格刷新,q退出)

                   pstree(unixptree)

                   kill向进程发送信号

                            kill-s 信号进程id

                            kill-l 显示进程能接收的所有信号

                   知道进程有很多属性:ps可以查看的属性

                   ulimite-a

         2.创建进程

                   1.代码?加载到内存?分配CPU时间片?

                            代码由独立的程序存在。

                   2.进程有关的创建函数

                            intsystem(const char *filename);

                                     简历独立进程,拥有独立的代码空间,内存空间。

                                     等待新的进程执行完毕,system才返回。(阻塞)

                            案例:使用system调用一个程序。

                                     观察进程ID

                                     观察阻塞。

                                               新的返回值与system返回值有关系。

                                               任何进程的返回值:不要超过255。返回值是一个字节。

                                               system的返回值中8-15位存放返回码。(r>>8&255才是返回值)

练习:使用system调用ls -l

                            子进程:被创建进程。

                            父进程:相对被创建者的进程。

                            popen:

                                     创建子进程

                                     在父子进程之间建立一个管道。

                            案例:

                                     使用popen调用ls -l,并且建立一个管道读取输出

                                    

                            exec系列函数

                                     execlexeclp

                                     替换当前进程的代码空间中的代码数据。

                                     函数本身不创建新的进程。

                                     intexecl(const char *path,char *arg...);

                                     第一个参数:要替换的程序。

                                     第二个参数...:命令行

                                               命令行格式:命令名选项参数

                                               命令行结尾必须是空字符串结尾。

                            案例:

                                     使用exec执行一个程序。

                                     体会:是否创建新的进程?

                                                        体会execl的参数的命令行的格式

                                                        体会execlexeclp的区别(execl只认识当前路径,execlp使用系统的搜索路径-which能找到的路径)

                                                        体会execl替换当前进程的代码

                            fork

                                     pid_tfork();

                                     1.创建进程

                                     2.新进程的代码是什么:

                                               克隆父进程的代码

                                               而且克隆了执行的位置

                                     3.在子进程步调用fork所以返回值=0

                                     4.父子进程同时执行

                                    

         3.应用进程

                   使用fork创建新的进程有什么应用价值呢?

                   使用fork实现多任务.(Unix系统本身是不支持线程的)

                            多任务

                            1.进程

                            2.线程

                            3.信号

                            4.异步

                            5.进程池与线程池

                   案例:

                            使用进程创建实现多任务

                                     1.UI

                                     2.建立多任务框架

                                     3.分别处理不同的任务

         4.理解进程

                   1.父子进程的关系

                            独立的两个进程

                            互为父子关系

                   2.问题:

                            2.1.父进程先结束

                                               子进程就依托根进程init:孤儿进程

                                               孤儿进程没有任何危害。

                            2.2.子进程先结束

                                               子进程会成为僵死进程

                                               僵死进程不占用内存和CPU,但在进程任务管理树上占用一个结构体。

                                               僵死进程造成进程名额资源浪费

                                               所以处理僵尸进程。

                   3.僵死进程使用wait回收

                   4.父进程怎么知道子进程退出?

                            子进程结束通常向父进程发送一个信号

                                     SIGCHLD

                   5.父进程处理子进程退出信号

                            signal(intsig, void(*fun)(int));

                            向系统注册:只要SIG信号发生,系统停止进程,并调用signal(int sig, void(*fun)(int));

                            当函数执行完毕,继续原来进程

                            5.1实现处理函数

                            5.2使用signal绑定信号与函数

僵死进程回收案例:

                   6.父子进程的资源访问

                            6.1 内存资源

                            6.2文件资源

案例:

         说明;

                   子进程克隆了父进程的全局区、局部区内存

                   子进程虚拟地址重新映射的(映射独立的)

                   子进程克隆整个内存区域,但内存区域指向不同的物理空间

                   尽管克隆,但内存独立。不能相互访问。

                   多进程实现多任务,进程之间的数据交换是大问题。(IPC Inter-Process Commucation)

                   映射内存:

                            MAP_SHARED:映射到同一物理内存

                            MAP_PRIVATE:映射到不同的物理内存

案例:

         两个进程之间,文件描述符号指向的是同一个文件内核对象。

                   结论:

                            进程的数据交换,基于两种方式;

                                     内存:有序/无序: mmap()

                                     文件:有序/无序:普通文件

                            基于内核中同一个对象:文件,内存,队列

                            每个进程维护一个描述符列表。/proc/${PID}/fd/

回顾:

         1.目录遍历

         2.进程创建 systempopen exec fork

         3.僵死进程出现的条件以及回收

         4.利用多进程实现简单的多任务

         5.理解进程的克隆

作业:

         1.使用两个进程,查找素数:(多任务)

                   A进程查找1 - 5000

                   B进程查找5001 -10000

                   把素数写入文件。

         2.写一个多任务:(两个进程数据共享)

                   A进程查找素数,放入mmap分配的空间

                   B进程把mmap的数据取出来,判定两个数据是否相邻

                            相邻就打印这两个素数

思考:

         3.使用opendir/readir遍历指定目录下的所有*.c的文件

                     scandir

 

明天:

         一、进程的基本控制

         二、进程的高级控制 -信号

                  

你可能感兴趣的:(学习 Linux高级编程05_A)