实例2:确保数据一致性的双进程数据传输 写 读 [1] to chil [0] 父进程输出 子进程输入 父进程 子进程 读 写 父进程输入 [0] to_par [1] 子进程输出 在本例中,父子进程分别把自己的标准输入和标准输出重新定向到to chilz和 to_par管道中了,无论这两个进程执行相应的系统调用的顺序如何,两个管 道中的数据顺序不会发生变化,因此两个进程最终的读写结果不会改变。6
实例2:确保数据一致性的双进程数据传输 to_chil to_par [1] 写 [0] 读 [0] 读 [1] 写 父进程 子进程 子进程输入 子进程输出 父进程输出 父进程输入 在本例中,父子进程分别把自己的标准输入和标准输出重新定向到to_chil和 to_par管道中了,无论这两个进程执行相应的系统调用的顺序如何,两个管 道中的数据顺序不会发生变化,因此两个进程最终的读写结果不会改变。 6
#include <string.h> char string[]="hello,world"; main() { int count,i; int to_par[2],to_chil[2]; 体到父、子进程的管道*/ char buf[256]; pipe(to_par); pipe(to_chil); if (fork()==0) { 快子进程从此处开始运行* close(0); *关闭老的标准输入* dup(to_chil[O]); *把管道to chill的读指针复制到标准输入*/ close(1); :关闭老的标准输出*/ dup(to_par[1]); *把管道to par的写指针复制到标准输出*/ close(to_par[1]); *关闭不再需要的管道描述符*/ close(to_chil[0]); close(to_par[0]); close(to_chil[1]); for (; if((count=read(0,buf,sizeof(buf))==0) exit(); write(1,buf,count); 7
#include <string.h> char string[ ] = “hello,world”; main( ) { int count, i; int to_par[2], to_chil[2]; /* 到父、子进程的管道 */ char buf[256]; pipe(to_par); pipe(to_chil); if (fork( ) == 0) { /* 子进程从此处开始运行 */ close(0); /* 关闭老的标准输入 */ dup(to_chil[0]); /* 把管道to_chil的读指针复制到标准输入 */ close(1); /* 关闭老的标准输出 */ dup(to_par[1]); /* 把管道to_par的写指针复制到标准输出 */ close(to_par[1]); /* 关闭不再需要的管道描述符 */ close(to_chil[0]); close(to_par[0]); close(to_chil[1]); for (; ;) { if((count=read(0, buf, sizeof(buf)) == 0) exit(); write(1, buf, count); } 7
体父进程从此处开始运行* close(1); *重新设置父进程的标准输入和输出*/ dup(to_chil[1]); close(0); dup(to_par[0]); close(to_chil[1]); close(to_par[0]); close(to_chil[0]); close(to_par[1]); for (i=0;i<15;i++) write(1,string,strlen(string);体每次向to_chil管道写11个字符*/ read(0,buf,sizeof(buf)); /*每次从to par管道读256个字符*/ } } 8
/* 父进程从此处开始运行 */ close(1); /* 重新设置父进程的标准输入和输出 */ dup(to_chil[1]); close(0); dup(to_par[0]); close(to_chil[1]); close(to_par[0]); close(to_chil[0]); close(to_par[1]); for (i=0; i<15; i++) { write(1, string, strlen(string)); /* 每次向to_chil管道写11个字符 */ read(0, buf, sizeof(buf)); /* 每次从to_par管道读256个字符 */ } } 8
7.2软中断信号 1、软中断信号的作用: 通知进程发生了异步事件需要处理。 2、软中断信号的发送: 进程之间相互发送; 进程之内给自己发送。 3、发送软中断信号的方法: kl系统调用 9
7.2 软中断信号 1、软中断信号的作用: 通知进程发生了异步事件需要处理。 2、软中断信号的发送: 进程之间相互发送; 进程之内给自己发送。 3、发送软中断信号的方法: kill 系统调用 9
4、软中断信号的分类: (1)、与进程终止相关的软中断信号 例如进程退出时 (2)、与进程例外事件相关的软中断信号 例如地址越界、写只读内存区 (3)、在系统调用期间遇到不可恢复的条件相关的软中断信号 例如执行exec而系统资源已用完 (4)、在系统调用时遇到的非预测错误条件产生的软中断信号 例如调用不存在的系统调用、向无读进程的管道写数据 (5)、由在用户态下运行的进程发出的软中断信号 例如用k川向自己或其他进程发出的软中断信号 (6)、与终端交互有关的软中断信号 终端上按的break键或delete键等 (7)、跟踪进程执行的软中断信号 10
4、软中断信号的分类: (1)、与进程终止相关的软中断信号 例如进程退出时 (2)、与进程例外事件相关的软中断信号 例如地址越界、写只读内存区 (3)、在系统调用期间遇到不可恢复的条件相关的软中断信号 例如执行exec而系统资源已用完 (4)、在系统调用时遇到的非预测错误条件产生的软中断信号 例如调用不存在的系统调用、向无读进程的管道写数据 (5)、由在用户态下运行的进程发出的软中断信号 例如用kill向自己或其他进程发出的软中断信号 (6)、与终端交互有关的软中断信号 终端上按的break键或delete键等 (7)、跟踪进程执行的软中断信号 10