类型 | 缘由 | 异步/同步 | 返回行为 |
---|---|---|---|
中断 | 来自I/O设备的信号 | 异步 | 老是返回到下一条指令 |
陷阱 | 有意的异常 | 同步 | 老是返回到下一条指令 |
故障 | 潜在可恢复的错误 | 同步 | 可能返回到当前指令 |
终止 | 不可恢复的错误 | 同步 | 不会返回 |
每个Linux文件都有一个类型来代表他在系统中的角色html
1.普通文件包含任意数据。应用程序经常要区分文本文件和二进制文件,文本文件是只含有ASCII或Unicode字符的普通文件;二进制文件是全部其余的文件。对内核而言,文本文件和二进制文件没有区别。关于exec()函数
fork函数是用于建立一个子进程,该子进程几乎是父进程的副本,而有时咱们但愿子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另外一个程序执行的方法。它能够根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完以后,原调用进程的内容除了进程号外,其余所有被新程序的内容替换了。另外,这里的可执行文件既能够是二进制文件,也能够是Linux下任何可执行脚本文件。
在Linux中并无exec函数,而是有6个以exec开头的函数族,下表列举了exec函数族的6个成员函数的语法。node
所需头文件 | #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[]) |
函数返回值 | 成功:函数不会返回 |
函数返回值 | 出错:返回-1,失败缘由记录在error中 |
要记住这六个函数之间的区别,就要搞清楚 “l” 、“v”、“p”、“e”表明的含义git
“l”表示参数以列表的形式表示; “v”表示参数以数组的形式表示; “p”表示在PATH中搜索执行文件; “e”表示可附加环境参数。 execlp、execvp这两个函数第一个形参是名为file表示能够只列出文件名就能够了,不用指出它的路径。
阻塞(若是其全部子进程都还在运行)。数组
带回子进程的终止状态当即返回(若是已有一个子进程终止,正等待父进程取其终止状态)安全
出错当即返回(若是它没有任何子进程)。网络
所需头文件 | #include <sys/types.h> #include <sys/wait.h> |
---|---|
函数说明 | wait()会暂时中止目前进程的执行,直到有信号来到或子进程结束。若是在调用wait()时子进程已经结束,则wait()会当即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一块儿返回。若是不在乎结束状态值,则status能够设成NULL |
函数原型 | pid_t wait (int *status) |
函数传入值 | 这里的status 是一个整型指针,是该子进程退出时的状态:1.status 若为空,则表明不记录子进程结束状态。2.status 若不为空,则由status记录子进程的结束状态值。 |
函数返回值 | 成功返回子进程识别码(PID) |
函数返回值 | 出错-1,失败缘由存于errno中 |
所需头文件 | #include <sys/types.h> #include <sys/wait.h> |
---|---|
函数说明 | waitpid()会暂时中止目前进程的执行,直到有信号来到或子进程结束。若是在调用waitpid()子进程已经结束,则waitpid()会当即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一块儿返回。若是不在乎结束状态值,则参数status能够设成NULL。参数pid为欲等待的子进程识别码 |
函数原型 | pid_t waitpid(pid_t pid,int * status,int options) |
函数传入值 | pid<-1:等待进程组识别码为pid绝对值的任何子进程 |
函数传入值 | pid=-1: 等待任何子进程,至关于wait() |
row 1 col 1 | pid=0:等待进程组识别码与目前进程相同的任何子进程 |
row 2 col 1 | pid=>0:等待任何子进程识别码为pid的子进程 |
函数传入值 | 参数options能够为0 或下面的OR 组合 |
函数传入值 | 参数options,WNOHANG:若是没有任何已经结束的子进程则立刻返回,不予以等待。此时返回值为0 |
函数传入值 | 参数options,WUNTRACED:若是子进程进入暂停执行状况则立刻返回,但结束状态不予以理会 |
函数传出值 | 同wait函数 |
函数返回值 | 成功返回子进程识别码(PID) |
函数返回值 | 成功使用选项WNOHANG且没有子进程退出返回0 |
函数返回值 | 出错-1,失败缘由存于errno中 |
exit函数,
exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束return()是当前函数返回,固然若是是在主函数main,天然也就结束当前进程了,若是不是,那就是退回上一层调用。在多个进程时.若是有时要检测上进程是否正常退出的就要用到上个进程的返回值..数据结构
int open(char* filename,int flags,mode_t mode)
opne函数将filename转换为一个文件描述符,而且返回描述符数字。返回的描述符老是在进程中当前没有打开的最小描述符。flags参数指明了进程打算如何访问这个文件:
1.O_RDONLY:只读.
2.O_WRONLY:只写
3.O_RDWR:可读可写
4.O_CREAT:若是文件不存在,就建立他的一个截断的空文件
5.O_TRUNC:若是文件已经存在,就截断它。
6.O_APPEND:在每次写操做前,设置文件位置到文件的结尾处。并发
ssize_t read(int fd,void *buf,size_t n); ssize_t write(int fd,const void *buf,size_t n);
关于read函数异步
返回值:成功则返回读的字节数,EOF返回0,出错返回-1。函数
fd:文件描述符
buf:存储器位置
n:最多从当前文件位置拷贝n个字节到存储器位置buf
关于write函数
返回值:成功则返回写的字节数,出错返回-1。
fd:文件描述符
buf:存储器位置
n:最多从存储器位置buf拷贝n个字节到当前文件位置
共享文件,内核用三个相关的数据结构来表示打开的文件:
1.描述符表:每一个进程都有独立的描述符表,由进程打开的文件描述符来索引,每一个打开的描述符表项指向文件表中的一个表项。
2.文件表:全部进程共享,表项组成包括当前文件位置、引用计数、一个指向v-node表中对应表项的指针。引用计数为0时,内核会删除这个文件表表项。
3.v-node表:全部进程共享,每一个表项包含stat结构中的大多数信息。
书p603rio_read函数中,erro!=EINTR我感受应该是erro==EINTR
[20155317](http://www.cnblogs.com/wxwddp/p/7671075.html)  - 结对学习内容 - XXXX - XXXX - ...
xxx
xxx
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进本身的计划能力。这个工做学习中很重要,也颇有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:XX小时
实际学习时间:XX小时
改进状况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)