书签 分享 收藏 举报 版权申诉 / 25
上传文档赚钱

类型实验十七Linux下进程线程的创建课件.ppt

  • 上传人(卖家):晟晟文业
  • 文档编号:4380255
  • 上传时间:2022-12-04
  • 格式:PPT
  • 页数:25
  • 大小:210.50KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《实验十七Linux下进程线程的创建课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    实验 十七 Linux 进程 线程 创建 课件
    资源描述:

    1、 LinuxLinux下进程和线程的创建下进程和线程的创建 吴国伟NoImage学习Linux中创建进程的方法学习系统调用Fork的使用方法学习系统调用Exec族的使用方法学习Linux中创建线程的方法学习pthread_create使用方法NoImageNoImage12/4/2022PIDPID:进程号。PPIDPPID:父进程号。UIDUID:其创建者的用户标识号,父子进程有相同的UID值。NoImageNoImageLinuxLinux进程创建进程创建Linux进程的族亲关系Linux进程之间不是孤立存在的,它们之间有一定的族亲关系。一个进程的子进程可以多于一个。一个进程只会有一个父进

    2、程。进程1进程2父进程子进程产产 生生NoImageLinuxLinux进程创建进程创建系统加电启动后,系统中只有一个进程初始化进程,又称init进程,是所有进程的祖先进程,它的进程pid=1在linux中除了init进程是由系统启动时创建的外,其他所有进程都是由当前进程使用系统调用fork()创建的。进程创建后父子进程在系统中并发执行。NoImage进程结构进程结构同时运行grep程序,在不同文件中查找不同的字符串PID 101代码数据s=“one”函数库文件Trek.txtPID 102代码数据s=“two”函数库文件Next.txtgrep程序代码C语言函数库NoImageForkFor

    3、k()()系统调用系统调用此时一个进程“分裂”成两个进程:父进程和子进程。区别:进程ID。利用getpid()来得到进程号。通过fork创建一个新进程,系统复制当前进程,在进程表中创建一个新的表项新进程几乎与原进程相同,执行代码也相同但有自己的数据空间,环境,文件描述符等#include pid_t fork();NoImageForkFork()()系统调用系统调用fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:父进程:返回子进程的PID;子进程:返回0;出现错误:返回-1;最初的进程fork()原进程继续执行新进程返回一个新的pid返回0NoIma

    4、ge12/4/2022#include#include#include int main()int pid=fork();if(pid=-1)printf(error!n);else if(pid=0)printf(This is the child process!nchild process id=%dn,getpid();else printf(This is the parent process!nparent process id=%dn,getpid();return 0;NoImageNoImage12/4/2022运行结果:This is the child process!c

    5、hild process id=4800This is the parent process!parent process id=4799NoImageNoImageForkFork()()系统调用系统调用NoImageNoImage等待一个进程结束等待一个进程结束#include#includepid_t wait(int*stat_loc)父进程调用1.wait系统调用将暂停父进程直到它的子进程结束为止2.返回子进程的PID3.状态信息允许父进程了解子进程的退出状态,即子进程main函数返回值或子进程中exit函数的退出码4.若stat_loc不为空指针,状态信息被写入他指定的为止NoIm

    6、age12/4/2022父进程创建子进程后,子进程一般要执行不同的程序.为了调用系统程序,我们可以使用系统调用exec 族调用。Exec函数可以把当前进程替换为一个新进程exec函数包含以下五个函数:NoImage#includeint execl(constchar*path,const char*arg,);int execlp(constchar*file,const char*arg,);int execle(constchar*path,const char*arg,char*const envp);int execv(constchar*path,char*const argv);

    7、int execvp(constchar*file,char*const argv);NoImage12/4/2022其中只有execve是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。#includeintexecve(constchar*path,char*const argv,char*const envp);path:可执行文件路径。argv:要执行的文件名或命令名。envp:环境变量,可省略NoImageNoImageLinux Linux 创建线程创建线程线程:一个进程内部的一个控制序列每个进程都至少有一个执行线程创建线程与创建线程与forkfork区别区别fork:f

    8、ork:当前进程的拷贝,有自己的变量和PID,时间调度独立,执行几乎完全独立于父进程新线程:新线程:有自己独立栈(有局部变量)但与创建者共享全局变量,文件描述,信号句柄和当前状态等NoImage线程优缺点线程优缺点优点:一般而言,线程创建以及线程之间的切换需要操作系统做的工作比进程少得多。例子:编辑文档过程的多线程,一个线程负责用户输入和编辑,一个线程负责字数统计缺点:缺点:多线程程序因变量共享可能引发潜在错误,调试困难NoImagepthread_creatpthread_creatint pthread_create(pthread_t*thread,pthread_attr_t*attr

    9、,void*(*start_routine)(void*),void*arg)参数1.该指针指向的变量中将被写入一个标识符,用该 标识符来引用新线程2.设置线程属性,一般不用设为null3.表示线程将要启动执行的函数4.该函数需要的参数调用成功返回值为0,否则返回错误代码NoImagevoid pthread_exit(void void pthread_exit(void*retval)retval)调用上面函数终止线程返回一个指向某个对象的指针注意:不能用它来返回一个指向局部变量的指针,因为线程调用该函数后,这个局部变量就不存在了NoImagepthread_joinpthread_joi

    10、nint pthread_join(pthread_t th,void*thread_return)等待线程结束,收集线程信息参数1.指定了将要等待结束的线程参数2.是一个指针,指向了一个指针,后者指向线程的返回值NoImage例子例子#include#include#include#include void*thread_function(void*arg);char message=Hello world;int main()int res;pthread_t a_thread;void*thread_result;res=pthread_create(&a_thread,NULL,thr

    11、ead_function,(void*)message);if(res!=0)perror(Thread creation failed);exit(EXIT_FAILURE);printf(Waiting for thread to finish.n);NoImageres=pthread_join(a_thread,&thread_result);if(res!=0)perror(Thread join failed);exit(EXIT_FAILURE);printf(Thread joined,it returned%sn,(char*)thread_result);printf(Me

    12、ssage is now%sn,message);exit(EXIT_SUCCESS);void*thread_function(void*arg)printf(thread_function is running.Argument was%s n,(char*)arg);sleep(3);strcpy(message,Bye!);pthread_exit(Thank you for the CPU time);NoImage运行结果运行结果Waiting for thread to finish.thread_function is running.Argument was Hello wo

    13、rldThread joined,it returned Thank you for the CPU timeMessage is now Bye!编译须知:gcc-lpthread-o file file.c NoImage随堂作业随堂作业3.4 3.64.7 4.11NoImage3.6Fibonacci序列是一组:0,1,1,2,3,5,8,fib0=0;fib1=1;fibn=fibn-1+fibn-2;使用系统调用fork()编写一个C程序,它在其子程序中生成Fibonacci序列,序列号码将会在命令行中提供。例如,如果提供的是5,Fibonacci序列中的前5个数将由子进程输出。由

    14、于父进程和子进程都有他们自己的数据副本,对子进程而言,输出序列式必要的。退出程序前,父进程调用wait()调用来等待子进程结束。执行必要的错误检查以保证不会接受命令行传递来的负数号码。NoImage4.11Fibonacci序列是一组:0,1,1,2,3,5,8,fib0=0;fib1=1;fibn=fibn-1+fibn-2;使用phtread多线程编程程序来生成Fibonacci序列。程序应该这样工作:用户运行程序时,在命令行输入要产生Fibonaci序列数,然后程序创建一个新的线程来产生Fibonacci数,把这个序列放到线程共享的数据中(数组可能是一种最方便的数据结构)。当线程执行完成后,父线程将输出子线程产生的序列。由于在子线程结束前,父线程不能开始输出Fibonacci序列,因此,父线程需要等子线程结束

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:实验十七Linux下进程线程的创建课件.ppt
    链接地址:https://www.163wenku.com/p-4380255.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


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

    163文库