ImageVerifierCode 换一换
格式:PPT , 页数:64 ,大小:605.91KB ,
文档编号:4701837      下载积分:28 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-4701837.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(晟晟文业)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(操作系统实验辅导课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

操作系统实验辅导课件.ppt

1、20111.2nLinux实验环境n系统调用n其他问题n实验讲解1.3n系统常用命令n编辑器n编译器n调试器1.4n显示目录文件 lsn执行格式:ls -atFlgR name (name可为文件或目录名称)例:ls 显示出当前目录下的文件ls -a 显示出包含隐藏文件的所有文件ls -t 按照文件最后修改时间显示文件 ls -F 显示出当前目录下的文件及其类型ls -l 显示目录下所有文件的许可权、拥有者、文件大 小、修改时间及名称ls -lg 同上ls -R 显示出该目录及其子目录下的文件 1.5n建新目录 mkdirn执行格式:mkdir directory-name例:mkdir di

2、r1新建一个名字为dir1的目录1.6n删除目录rmdirn执行格式:rmdir directory-name 或 rm directory-name例:rmdir dir1 删除目录dir1,但它必须是空目录,否则无法删除rm -r dir1 删除目录dir1及其下所有文件及子目录rm -rf dir1 不管是否空目录,统统删除,而且不给出提示,使用时要小心1.7n改变工作目录位置 cdn执行格式:cd name 例:cd 改变目录位置至用户login时的working directorycd dir1 改变目录位置,至dir1目录cd user 改变目录位置,至用户的working dir

3、ectorycd .改变目录位置,至当前目录的上层目录cd ./user 改变目录位置,至上一级目录下的user目录cd /dir-name1/dir-name2 改变目录位置,至绝对路径cd -回到进入当前目录前的上一个目录1.8n显示当前所在目录 pwdn执行格式:pwd1.9删除文件 rm执行格式:rm filename 例:rm file 删除名字为file的文件1.10n复制文件 cpn执行格式:cp -r source destination 例:cp file1 file2 将file1复制成file2cp file1 dir1 将file1复制到目录dir1cp /tmp/fi

4、le1 将file1复制到当前目录cp /tmp/file1 file2 将file1 复制到当前目录名为 file2cp r dir1 dir2 (recursive copy)复制整个目 录。1.11n移动或更改文件、目录名称 mvn执行格式:mv source destination例:mv file1 file2 将文件file1,更名为file2mv file1 dir1 将文件file1,移到目录dir1 下mv dir1 dir2 将目录dir1,更名为dir21.12n查看系统目前的进程 ps n执行格式:ps -aux例:ps 或ps -x 查看系统中属于自己的process

5、ps -au 查看系统中所有使用者的processps -aux 查看系统中包含系统内部及所有使用者 的processps -aux|grep apache 找出系统中运行的所有名称 中带有“apache”串的 process1.13n结束或终止进程 killn执行格式:kill -9 PID (PID为利用ps命令所查出的process ID)例:kill 456kill -9 456 终止process ID 为456的process1.14n命令在线帮助 mann执行格式:man command例:man ls 查询ls这个指令的用法1.15nvi的全称是visual editor,它是

6、在Unix/Linux 上被广泛使用的中英文编辑器。n启动vivi 进入vi编辑器界面,没有为 所编辑的文件命名vi filename 进入vi编辑器界面,并将所 编辑的文件命名为filename 1.16vi提供三种工作模式:n输入编辑模式支持:输入文本信息n命令编辑模式支持:进行删除、修改等操作信息n命令模式支持:进行存盘、退出等操作注意:使用者进入vi后,即处在命令模式下,要输入信息,则要切换至输入模式。1.171.18命令编辑模式下:1.19在命令模式下:1.20ngedit是Unix/Linux系统下的另一种中英文文本编辑器,支持窗口模式,更加方便快捷。n启动gedit:gedit

7、进入gedit编辑器界面,没有为所编辑的文件命名gedit filename 进入gedit编辑器界面,并将所编辑的文件命名为 filename1.21nLINUX上可用的C编译器是GNU C编译器(GCC),一般的Unix下使用的是CC编译器n通常后跟一些选项和文件名来使用GCC编译器。基本用法如下:gcc options filenamesn通过命令行选项指定编译过程中的具体操作1.22GCC常用选项nGCC有超过100个的编译选项可用,这些选项中的许多可能永远都不会用到,但一些主要的选项将会频繁使用。很多的GCC选项包括一个以上的字符,因此必须为每个选项指定各自的连字符,并且就像大多数L

8、INUX 命令一样不能在一个单独的连字符后跟一组选项。例如,下面的命令是不同的:gcc -p-g test.c gcc -p test.c 第一条命令告诉GCC编译test.c时为prof命令建立剖析(profile)信息并且把调试信息加入到可执行文件里。第二条命令告诉GCC只为gprof命令建立剖析信息。1.23GCC常用选项n当不用任何选项编译一个程序时,GCC将建立(假定编译成功)一个名为a.out的可执行文件。例如,gcc test.c 编译成功后,当前目录下就产生了一个a.out文件。n也可用-o选项来为即将产生的可执行文件指定一个文件名来代替a.out。例如:gcc o count

9、 count.c 此时得到的可执行文件就不再是a.out,而是count。1.24执行文件 n格式:./可执行文件名例:./a.out ./count1.25nLINUX包含了一个叫gdb的GNU调试程序。gdb是一个用来调试C和C+程序的强有力调试器。它使你能在程序运行时观察程序的内部结构和内存的使用情况。它具有以下一些功能:监视程序中变量的值;设置断点以使程序在指定的代码行上停止执行;一行行的执行代码。1.26n为了使gdb正常工作,必须使你的程序在编译时包含调试信息。调试信息里包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb利用这些信息使源代码和机器码相关联

10、。n在编译时用 g 选项打开调试选项。1.27n调试命令1.28应用举例(1)设有一源程序 test.c(2)编译,gcc -ggdb o greet greet.c(3)gdb greet,出现提示符(gdb),此时可在提示符下输入gdb的命令了,如:(gdb)run(gdb)list(4)退出调试状态,返回系统提示符下,(gdb)quit1.29n字面上讲,系统调用(也称为“syscall”)就是一条类似于“add”或者“jump”的指令。从更高的层面上讲,系统调用是用户级程序要求操作系统为它做某些事情的途径。n首先,用户程序为系统调用设置参数。其中一个参数是系统调用编号(稍后对此进行详述

11、)。注意,所有这些都是由库函数自动完成的,除非您是使用汇编编程。参数设置完成后,程序执行“系统调用”指令。这个指令会导致一个异常:产生一个事件,这个事件会致使处理器跳转到一个新的地址,并开始执行那里的代码。1.30举例说明:1.fork()创建进程 stdio.h 2.2.waitwait()等待子进程运行结束 stdio.h3.3.exitexit()终止进程的执行 stdio.h4.4.lockf(files,function,size)lockf(files,function,size)锁定文件 unistd.h 5.5.kill()kill()发送信号发送信号 signal.h sig

12、nal.h 6.6.signal()signal()预置对信号的处理方式预置对信号的处理方式 signal.hsignal.h 注意:程序中用到系统调用的时候,要包含相关的头文件如:#include 1.31fork()#include pid_t fork(void);n创建一个新进程。n系统调用格式:pid=fork()n参数定义:int fork()nfork()返回值意义如下:0:在子进程中,pid变量保存的fork()返回值为0,表示当前进程是子进程。0:在父进程中,pid变量保存的fork()返回值为子进程的id值(进程唯一标识符)。-1:创建失败。1.32n如果fork()调用成

13、功,它向父进程返回子进程的PID,并向子进程返回0,即fork()被调用了一次,但返回了两次。此时OS在内存中建立一个新进程,所建的新进程是调用fork()父进程(parent process)的副本,称为子进程(child process)。子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文。父进程与子进程并发执行。1.33核心为fork()完成以下操作:n为新进程分配一进程表项和进程标识符 进入fork()后,核心检查系统是否有足够的资源来建立一个新进程。若资源不足,则fork()系统调用失败;否则,核心为新进程分配一进程表项和唯一的进程标识符。n检查同时运行的进程数目 超

14、过预先规定的最大数目时,fork()系统调用失败。n拷贝进程表项中的数据 将父进程的当前目录和所有已打开的数据拷贝到子进程表项中,并置进程的状态为“创建”状态。n子进程继承父进程的所有文件 对父进程当前目录和所有已打开的文件表项中的引用计数加1。n为子进程创建进程上、下文 进程创建结束,设子进程状态为“内存中就绪”并返回子进程的标识符。n子进程执行 虽然父进程与子进程程序完全相同,但每个进程都有自己的程序计数器PC(注意子注意子进程的进程的PC开始位置开始位置),然后根据pid变量保存的fork()返回值的不同,执行了不同的分支语句。1.34wait()#include n等待子进程运行结束。

15、如果子进程没有完成,父进程一直等待。wait()将调用进程挂起,直至其子进程因暂停或终止而发来软中断信号为止。如果在wait()前已有子进程暂停或终止,则调用进程做适当处理后便返回。n系统调用格式:int wait(status)int *status;n其中,status是用户空间的地址。它的低8位反应子进程状态,为0表示子进程正常结束,非0则表示出现了各种各样的问题;高8位则带回了exit()的返回值。exit()返回值由系统给出。1.35核心对wait()作以下处理:n首先查找调用进程是否有子进程,若无,则返回出错码;n若找到一处于“僵死状态”的子进程,则将子进程的执行时间加到父进程的执

16、行时间上,并释放子进程的进程表项;n若未找到处于“僵死状态”的子进程,则调用进程便在可被中断的优先级上睡眠,等待其子进程发来软中断信号时被唤醒。1.36exit()n终止进程的执行。n系统调用格式:void exit(status)int status;n其中,status是返回给父进程的一个整数,以备查考。n为了及时回收进程所占用的资源并减少父进程的干预,UNIX/LINUX利用exit()来实现进程的自我终止,通常父进程在创建子进程时,应在进程的末尾安排一条exit(),使子进程自我终止。exit(0)表示进程正常终止,exit(1)表示进程运行有错,异常终止。n如果调用进程在执行exit

17、()时,其父进程正在等待它的终止,则父进程可立即得到其返回的整数。1.37核心须为exit()完成以下操作:n关闭软中断n回收资源n写记帐信息n置进程为“僵死状态”1.38lockf(files,function,size)n用锁定文件的某些段或者整个文件。n本函数的头文件为#include unistd.hn系统调用格式:int lockf(files,function,size)int files,function;long size;n其中:files是文件描述符;function是锁定和解锁:1表示锁定,0表示解锁。size是锁定或解锁的字节数,为0,表示从文件的当前位置到文件尾。1.

18、39kill()#include n系统调用格式int kill(pid,sig)int pid,sig;n其中,pid是一个或一组进程的标识符,参数sig是要发送的软中断信号。(1)pid0时,核心将信号发送给进程pid。(2)pid=0时,核心将信号发送给与发送进程同组的所有进程。(3)pid=-1时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程。1.40signal()n预置对信号的处理方式,允许调用进程控制软中断信号。n系统调用格式signal(sig,function)int sig;void(*func)()n其中sig用于指定信号的类型,sig为0则表示没

19、有收到任何信号,其它信号类型见下页表格 1.411.42n内容:编写一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:Child process 1 is killed by parent!Child process 2 is killed by parent!父进程等待两个子进程终止后,输出以下信息后终止:Parent process is killed!n实验要求:(1)运行程序并分析结果。(2)

20、在程序中什么位置用了系统调用wait()和exit(),为什么?1.43n知识要点:进程的创建;父进程和子进程的关系;信号的种类;自定义信号处理函数;信号的发送;进程终止。n系统调用:fork,signal,kill,wait,exitsleep,pausen示例程序:1.44n进程创建过程l子进程是父进程的复制品。例如,子进程获得父进程数据空间、堆和栈的复制品。lfork该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程I D。l将子进程I D返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数使一个进程可以获得其所有子进

21、程的进程I D。f o r k使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用g e t p p i d以获得其父进程的进程I D。n父进程和子进程的关系:进程树结构(pstree命令)1.45nfork系统调用:#include#include pid_t fork(void);返回:子进程中为0,父进程中为子进程I D,出错为-1n例子 apue8-1.c$a.o u ta write to stdoutbefore forkpid=430,glob=7,var=89 子 进 程 的变量值改变了pid=429,glob=6,var=88 父 进 程 的变量值没

22、有改变l说明:子进程复制了父进程数据空间、堆和栈。注意,这是子进程所拥有的拷贝拷贝。父、子进程并不共享这些存储空间部分。(如果正文段是只读的,则父、子进程共享正文段。)1.46n进一步测试,当将标准输出重新定向到一个文件时:$a.out temp.out$cat temp.outa write to stdoutbefore forkpid=432,glob=7,var=89before forkpid=431,glob=6,var=88n说明:l子进程继承父进程重定向之后的输出文件;l得到p r i n t f输出行两次。其原因是,如果标准输出连到终端设备则它是行缓存的,否则它是全缓存的。l

23、在f o r k之前调用了p r i n t f一次,但当调用f o r k时,该行数据仍在缓存中,然后在父进程数据空间复制到子进程中时,该缓存数据也被复制到子进程中。于是那时父、子进程各自有了带该行内容的缓存。在e x i t之前的第二个p r i n t f将其数据添加到现存的缓存中。当每个进程终止时,其缓存中的内容被写到相应文件中。(两次)1.47n在重新定向父进程的标准输出时,子进程的标准输出也被重新定向。实际上,f o r k的一个特性是所有由父进程打开的描述符都被复制到子进程中。父、子进程每个相同的打开描述符共享一个文件表项。1.48nf o r k有两种用法:l(1)一个父进程希

24、望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的父进程等待委托者的服务请求。当这种请求到达时,父进程调用f o r k,使子进程处理此请求。父进程则继续等待下一个服务请求。l(2)一个进程要执行一个不同的程序。这对s h e l l是常见的情况。在这种情况下,子进程在从f o r k返回后立即调用e x e c。n某些操作系统将(2)中的两个操作(f o r k之后执行e x e c)组合成一个,并称其为s p a w n。U N I X将这两个操作分开,因为在很多场合需要单独使用f o r k,其后并不跟随e x e c。另外,将这两个操作分开,使得子进程在f o r

25、 k和e x e c之间可以更改自己的属性。如I/O重新定向、用户I D、信号排列等。1.49进程有三种正常终止法及两种异常终止法。n(1)正常终止:l(a)在m a i n函数内执行r e t u r n语句。如在7.3节中所述,这等效于调用e x i t。l(b)调用e x i t函数。此函数由ANSI C定义,其操作包括调用各终止处理程序,然后关闭所有标准I/O流等。(c)调用_ e x i t系统调用函数。此函数由e x i t调用,它处理U N I X特定的细节。_ e x i t是由P O S I X.1说明的。n(2)异常终止:l(a)调用a b o r t。它产生S I G A

26、 B RT信号,所以是下一种异常终止的一种特例。l(b)当进程接收到某个信号时。(第1 0章将较详细地说明信号。)进程本身(例如调用a b o r t函数)、其他进程和内核都能产生传送到某一进程的信号。例如,进程越出其地址空间访问存储单元,或者除以0,内核就会为该进程产生相应的信号。1.50#include void exit(int status);n终止进程能够通知其父进程它是如何终止的。对于e x i t和_ e x i t,这是依靠传递给它们的退出状态(exit status)参数来实现的。在异常终止情况,内核(不是进程本身)产生一个指示其异常终止原因的终止状态(termination

27、 status)。n在任意一种情况下,该终止进程的父进程都能用w a i t或w a i t p i d函数(在下一节说明)取得其终止状态。n但是如果父进程在子进程之前终止,则将如何呢?其回答是对于其父进程已经终止的所有进程,它们的父进程都改变为i n i t进程。我们称这些进程由i n i t进程领养。1.51#include#include pid_t wait(int s t*a t l o c);n调用w a i t或w a i t p i d的进程可能会:l阻塞阻塞(如果其所有子进程都还在运行)。l带子进程的终止状态立即返回(如果一个子进程已终止,正等待父进程存取其终止状态)。l出错

28、立即返回(如果它没有任何子进程)。1.52n控制终端l如果一个对话期有一个控制终端,则它有一个前台进程组,其他进程组则为后台进程组。l 无论何时键入中断键(常常是D E L E T E或C t r l-C)或退出键(常常是C t r l-),就会造成将中断信号或退出信号送至前台进程组的所有进程送至前台进程组的所有进程。l 如果终端界面检测到调制解调器已经脱开连接,则将挂断信号送至控制进程(对话期首进程。)1.53信号n信号是软件中断。很多比较重要的应用程序都需处理信号。信号提供了一种处理异步事件的方法:终端用户键入中断键,则会通过信号机构停止一个程序。n每个信号都有一个名字。这些名字都以三个字

29、符S I G开头。nsignumber.h -Signal number definitions.Linux version.#define SIGHUP 1 /*Hangup(POSIX).*/#define SIGINT 2 /*Interrupt(ANSI).*/#define SIGQUIT 3 /*Quit(POSIX).*/#define SIGILL 4 /*Illegal instruction(ANSI).*/#define SIGTRAP 5 /*Trace trap(POSIX).*/#define SIGABRT 6 /*Abort(ANSI).*/#define SI

30、GIOT 6 /*IOT trap(4.2 BSD).*/#define SIGBUS 7 /*BUS error(4.2 BSD).*/#define SIGFPE 8 /*Floating-point exception(ANSI).*/#define SIGKILL 9 /*Kill,unblockable(POSIX).*/#define SIGUSR1 10 /*User-defined signal 1(POSIX).*/#define SIGSEGV 11 /*Segmentation violation(ANSI).*/#define SIGUSR2 12 /*User-def

31、ined signal 2(POSIX).*/1.54n很多条件可以产生一个信号。l 当用户按某些终端键时,产生信号。在终端上按D E L E T E键通常产生中断信号(S I G I N T)。l 硬件异常产生信号:除数为0、无效的存储访问等等。这些条件通常由硬件检测到,并将其通知内核。然后内核为该条件发生时正在运行的进程产生适当的信号。例如,对执行一个无效存储访问的进程产生一个S I G S E G V。l 进程用k i l l(2)函数可将信号发送给另一个进程或进程组。自然,有些限制:接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必须是超级用户。l 用户可用k i l

32、 l(1)命令将信号发送给其他进程。此程序是k i l l函数的界面。常用此命令终止一个失控的后台进程。n信号是异步事件异步事件的经典实例。产生信号的事件对进程而言是随机出现的。进程不能只是测试一个变量(例如e r r n o)来判别是否发生了一个信号,而是必须告诉内核“在此信号发生时,请执行下列操作在此信号发生时,请执行下列操作”。-捕捉信号。为了做到这一点要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,可执行用户希望对这种事件进行的处理。#include typedef void(*sighandler_t)(int);sighandler_t signal(int signu

33、m,sighandler_t handler);1.55nk i l l函数将信号发送给进程或进程组。#include#include int kill(pid_t p i d,int s i g n o);p i d 0 将信号发送给进程I D为p i d的进程。p i d=0 将信号发送给其进程组I D等于发送进程的进程组I D,而且发送进程有许可权向其发送信号的所有进程。pid 0 将信号发送给其进程组I D等于p i d绝对值,而且发送进程有许可权向其发送信号的所有进程。np a u s e函数使调用进程挂起直至捕捉到一个信号。#include int pause(void);nsle

34、ep函数#include unsigned int sleep(unsigned int seconds);此函数使调用进程被挂起直到:(1)已经过了s e c o n d s所指定的墙上时钟时间,或者(2)该进程捕捉到一个信号并从信号处理程序返回。(提早返回)1.56n实验1 示例程序见 oslab1.c1.57n实验二实验二 模拟进程调度算法模拟进程调度算法n内容:实现教材中所描述的短进程优先调度算法(SPF)和时间片轮转调度算法(RR)。n要求:l进程通过定义一个进程控制块的数据结构(PCB)来表示;l每个进程需要赋予进程ID、进程到达时间、进程需要运行的总时间的属性;l在RR中,以1为

35、时间片单位;l运行时,输入5个进程序列,按照进程的ID输出其执行序列。1.58#define PNUM 20struct pcb int pid;int t_arrive;int t_need;/struct pcb procsPNUM;/随机序列生成:srand(unsigned)getpid();/初始化procsi.t_need=rand()%10;/0.9 time unit1.59n实验三实验三 多进程(线程)实现快速排序多进程(线程)实现快速排序l内容:编多进程及多线程程序实现对10000个随机数的快速排序算法。l要求:l产生10000个随机数,编写一个多进程(线程)实现快速排序算

36、法;要求说明你的程序运行的系统资源配置,给出测试结果并对测试程序和结果做出说明.回答用多进程实现和多线程实现体现了什么差异,产生的原因是什么?4实现提示:l每次数据分割后产生两个新的进程(线程)处理分割后的数据;l每个进程(线程)处理的数据小于500以后不再分割l内存文件映射mmap()1.60n快速排序:快速排序:void q_sort(int numbers,int left,int right)int pivot,l_hold,r_hold;l_hold=left;r_hold=right;pivot=numbersleft;while(left=pivot)&(left right)r

37、ight-;if(left!=right)numbersleft=numbersright;left+;while(numbersleft=pivot)&(left right)left+;if(left!=right)numbersright=numbersleft;right-;numbersleft=pivot;pivot=left;left=l_hold;right=r_hold;if(left pivot)q_sort(numbers,pivot+1,right);1.61n创建一个线程 nint pthread_create(pthread_t*thread,const pthre

38、ad_attr_t*attr,void*(*start_routine)(void*),void*arg);参数参数:lthread-returns the thread id.(unsigned long int defined in bits/pthreadtypes.h)创建线程的IDlattr-Set to NULL if default thread attributes are used.attr指出线程创建时候的属性,我们用NULL来表明使用缺省属性lvoid*(*start_routine)-pointer to the function to be threaded.Func

39、tion has a single argument:pointer to void.start_routine函数指针是线程创建成功後开始执行的函数l*arg-pointer to argument of function.To pass multiple arguments,send a pointer to a structure.表明传递给start_routine的参数1.62npthread_exit void pthread_exit(void*retval);lpthrea d_exit函数和exit函数类似用来退出线程.这个函数结束线程,释放函数的资源,并在最後阻塞,直到其他

40、线程使用pthread_join函数等待它.pthread_join#include int pthread_join(pthread_t thread,void*value_ptr);lpthread_join和wait调用一样用来等待指定的线程.注意由于线程不同于进程.所以线程的退出一定要用pthread_exit而不是使用exit.否则整个程序会退出的.1.63n#include#include#define NTHREADS 10void*thread_function(void*);pthread_mutex_t mutex1=PTHREAD_MUTEX_INITIALIZER;in

41、t counter=0;main()pthread_t thread_idNTHREADS;int i,j;for(i=0;i NTHREADS;i+)pthread_create(&thread_idi,NULL,thread_function,NULL);for(j=0;j NTHREADS;j+)pthread_join(thread_idj,NULL);/*Now that all threads are complete I can print the final result.*/*Without the join I could be printing a value befor

42、e all the threads*/*have been completed.*/printf(Final counter value:%dn,counter);/end of main()void*thread_function(void*dummyPtr)printf(Thread number%ldn,pthread_self();/get threadIDpthread_mutex_lock(&mutex1);counter+;pthread_mutex_unlock(&mutex1);1.64n程序运行结果ncc-lpthread join1.c Run:./a.out Results:lThread number 1026Thread number 2051Thread number 3076Thread number 4101Thread number 5126Thread number 6151Thread number 7176Thread number 8201Thread number 9226Thread number 10251Final counter value:10

侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|