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

上传人(卖家):晟晟文业 文档编号:4380255 上传时间:2022-12-04 格式:PPT 页数:25 大小:210.50KB
下载 相关 举报
实验十七Linux下进程线程的创建课件.ppt_第1页
第1页 / 共25页
实验十七Linux下进程线程的创建课件.ppt_第2页
第2页 / 共25页
实验十七Linux下进程线程的创建课件.ppt_第3页
第3页 / 共25页
实验十七Linux下进程线程的创建课件.ppt_第4页
第4页 / 共25页
实验十七Linux下进程线程的创建课件.ppt_第5页
第5页 / 共25页
点击查看更多>>
资源描述

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序列,因此,父线程需要等子线程结束

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

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


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

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


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