资源描述:
《计算机操作系统教程(机类本科)第8章》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第八章操作系统环境下的编程及应用第八章操作系统环境下的编程及应用8.1应用程序编程接口概述 8.2进程间通讯实现方法与实例8.3线程编程及实现方法第八章操作系统环境下的编程及应用8.1应用程序编程接口概述应用程序编程接口(ApplicationProgrammingIntertace,简称API)是由操作系统支持的函数定义、参数定义和消息格式的集合。应用程序可借助API函数处理系统提供的功能。WindowsAPI函数提供了Windows所支持的所有系统服务的功能。第八章操作系统环境下的编程及应用标准的Win3
2、2API函数总体上可以分成七类,分别为:(1)窗口管理。(2)窗口通用控制。(3)Shell特性。(4)图形设备接口。(5)系统服务。(6)国际特性。(7)网络服务。第八章操作系统环境下的编程及应用8.2进程间通讯实现方法与实例8.2.1管道了解管道的一个直观的例子是在命令中使用管道符,例如命令:ls-1
3、greplinux
4、more就使用了两个管道符,grep的输入来自于ls的输出,而grep的输出又作为more命令的输入使用。该命令的含义是在当前目录中查找名字中包含“linux”的目录或者文件,然后分屏显
5、示。 管道可以分成两类:无名管道(简称管道)和FIFO(也称为命名管道)。二者之间主要的区别在于无名管道只能用于父、子进程之间的通讯,而FIFO则可以用于任何进程之间的通讯。第八章操作系统环境下的编程及应用1.无名管道 所有的UNIX系统都支持管道的通讯机制。管道有两种限制:(1)管道是半双工的,数据只能单向流动; (2)管道只能在父子进程之间使用。 管道由系统调用pipe()产生,该函数的语法为 intpipe(intfd[2])参数fd用来存放pipe()创建的管道的句柄。fd[0]用于读,fd[1]用于
6、写。第八章操作系统环境下的编程及应用图8.1父进程向子进程传递信息的管道第八章操作系统环境下的编程及应用下面是一个使用管道实现子进程向父进程传递信息的例子:#include#include#includeintmain(void){intfd[2],nbytes;pid-tpid;charstring[]="Hello,world!\n";charreadbuffer[80];第八章操作系统环境下的编程及应用pipe(fd);/*创建管道*/if
7、((pid=fork())==-1)/*创建子进程*/{perror("fork");exit(1);}if(pid==0)/*子进程*/{close(fd[0]);/*关闭管道读句柄*/write(fd[1],string,strlen(string));/*向管道中写入数据*/-exit(0);}第八章操作系统环境下的编程及应用else/*父进程*/{close(fd[1]);/*关闭管道写句柄*/nbytes=read(fd[0],readbuffer,sizeof(readbuffer));/*从管道
8、中读取数据*/printf("ReceivedStrings:%s\n",readbuffer);}return(0);}第八章操作系统环境下的编程及应用popen函数原型为 FILE*popen(constchar*cmdstring,constchar*type)该函数首先创建一个管道,再执行fork创建一个子进程,然后调用exec执行cmdstring指定的命令,并返回一个标准的文件指针。该文件指针根据type值进行定位:如果type是“r”,则链接到cmdstring的标准输出上;如果type是“w”
9、,则链接到cmdstring的标准输入上。第八章操作系统环境下的编程及应用下面的程序实现ls
10、more的功能: #includeintmain(void){FILE*in-fp,*out-fp;charreadbuffer[80];if((in-fp=popen("ls","r")==NULL)){perror("popen");exit(1);}第八章操作系统环境下的编程及应用if((out-fp=popen("more","w")==NULL)){perror("popen");exi
11、t(1);}while(fgets(readbuf,80,in-fp))fputs(readbuf,out-fp);pclose(in-fp);pclose(out-fp);return(0);}第八章操作系统环境下的编程及应用2.FIFO在系统shell中,我们可以使用下面的命令来创建命名管道:mknodFIFOnamepmkfifo-m0666FIFOname而在C语言中,我们可以使用mknod