进程和线程程.doc

进程和线程程.doc

ID:55356331

大小:160.50 KB

页数:43页

时间:2020-05-11

进程和线程程.doc_第1页
进程和线程程.doc_第2页
进程和线程程.doc_第3页
进程和线程程.doc_第4页
进程和线程程.doc_第5页
资源描述:

《进程和线程程.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、进程和线程编程   看一下UNIX系统中的进程和Mach的任务和线程之间的关系。在UNIX系统中,一个进程包括一个可执行的程序和一系列的资源,例如文件描述符表和地址空间。在Mach中,一个任务仅包括一系列的资源;线程处理所有的可执行代码。一个Mach的任务可以有任意数目的线程和它相关,同时每个线程必须和某个任务相关。和某一个给定的任务相关的所有线程都共享任务的资源。这样,一个线程就是一个程序计数器、一个堆栈和一系列的寄存器。所有需要使用的数据结构都属于任务。一个UNIX系统中的进程在Mach中对应于一个任务和一个单独的线程。原始管道   使用C语言创建管道要比在shell下使用管道复杂一些。如

2、果要使用C语言创建一个简单的管道,可以使用系统调用pipe()。它接受一个参数,也就是一个包括两个整数的数组。如果系统调用成功,此数组将包括管道使用的两个文件描述符。创建一个管道之后,一般情况下进程将产生一个新的进程。   可以通过打开两个管道来创建一个双向的管道。但需要在子进程中正确地设置文件描述必须在系统调用fork()中调用pipe(),否则子进程将不会继承文件描述符。当使用半双工管道时,任何关联的进程都必须共享一个相关的祖先进程。因为管道存在于系统内核之中,所以任何不在创建管道的进程的祖先进程之中的进程都将无法寻址它。而在命名管道中却不是这样。pipe()系统调用:pipe();原型:

3、intpipe(intfd[2]);返回值:如果系统调用成功,返回0如果系统调用失败返回-1:errno=EMFILE(没有空闲的文件描述符)EMFILE(系统文件表已满)EFAULT(fd数组无效)注意fd[0]用于读取管道,fd[1]用于写入管道。#include#include#includemain(){intfd[2];pipe(fd);..}一旦创建了管道,我们就可以创建一个新的子进程:#include#include#includemain(){intf

4、d[2];pid_tchildpid;pipe(fd);if((childpid=fork())==-1){perror("fork");exit(1);}..}   如果父进程希望从子进程中读取数据,那么它应该关闭fd1,同时子进程关闭fd0。反之,如果父进程希望向子进程中发送数据,那么它应该关闭fd0,同时子进程关闭fd1。因为文件描述符是在父进程和子进程之间共享,所以我们要及时地关闭不需要的管道的那一端。单从技术的角度来说,如果管道的一端没有正确地关闭的话,你将无法得到一个EOF。#include#include#include

5、h>main(){intfd[2];pid_tchildpid;pipe(fd);if((childpid=fork())==-1){perror("fork");exit(1);}if(childpid==0){/*Childprocessclosesupinputsideofpipe*/close(fd[0]);}else{/*Parentprocessclosesupoutputsideofpipe*/close(fd[1]);}..}   正如前面提到的,一但创建了管道之后,管道所使用的文件描述符就和正常文件的文件描述符一样了。#include#include

6、std.h>#includeintmain(void){intfd[2],nbytes;pid_tchildpid;charstring[]="Hello,world!";charreadbuffer[80];pipe(fd);if((childpid=fork())==-1){perror("fork");exit(1);}if(childpid==0){/*Childprocessclosesupinputsideofpipe*/close(fd[0]);/*Send"string"throughtheoutputsideofpipe*/write(fd[1]

7、,string,strlen(string));exit(0);}else{/*Parentprocessclosesupoutputsideofpipe*/close(fd[1]);/*Readinastringfromthepipe*/nbytes=read(fd[0],readbuffer,sizeof(readbuffer));printf("Receivedstring:%s",read

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。