第五讲--linux 多进程与多线程程序设计

第五讲--linux 多进程与多线程程序设计

ID:34532503

大小:375.88 KB

页数:46页

时间:2019-03-07

上传者:xinshengwencai
第五讲--linux 多进程与多线程程序设计_第1页
第五讲--linux 多进程与多线程程序设计_第2页
第五讲--linux 多进程与多线程程序设计_第3页
第五讲--linux 多进程与多线程程序设计_第4页
第五讲--linux 多进程与多线程程序设计_第5页
资源描述:

《第五讲--linux 多进程与多线程程序设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

LINUX操作系统LINUXLINUX操作系统十讲操作系统十讲信息科学与工程学院付冲 LINUX操作系统Linux操作系统十讲第一讲Linux导论第二讲Linux文件系统与基本指令集第三讲LinuxC程序设计基础第四讲Linux文件系统程序设计第五讲Linux多进程与多线程程序设计第六讲Linux进程间通信程序设计第七讲Linux服务与TCP/IP网络程序设计第八讲LinuxShell程序设计第九讲LinuxGUI程序设计第十讲Linux前沿热点技术导论(集群,虚拟化,存储,安全) LINUX操作系统第五讲Linux多进程与多线程程序设计 LINUX操作系统5.1Linux编程—多进程例1.获得进程标识号程序名称:pripds.c LINUX操作系统补充知识1.进程的产生(1)多进程,进程编号PID(processID)(2)Linux系统的第一个进程:init,PID=1(3)新进程创建:fork(4)childprocess与parentprocess(5)系统每一个进程都是由父进程fork而来,都可向上追溯到init。 LINUX操作系统2.显示进程(a)命令:ps各自段说明:(1)PID:进程编号(2)TTY:进程执行时的终端(3)TIME:进程执行所使用的CPU时间(4)CMD:指令名称(b)显示的进程信息命令:ps-uax(Linux)或ps-le(Unix/Linux) LINUX操作系统u:查看进程所有者及其它一些详细信息a:显示终端上的所有进程,包括其他用户的进程x:显示没有控制终端的进程e:显示所有进程l:长格式(包含父进程编号PPID和优先级NI等) LINUX操作系统各字段说明:(1)USER:产生该进程的用户(2)PID:进程编号(3)%CPU:CPU占用率(4)%MEM:内存占用率(5)VSZ:占用的虚拟内存大小(6)RSS:占用内存大小(7)TTY:执行进程的终端(8)STAT:进程的状态(9)START:进程开始执行的时间 LINUX操作系统(10)TIME:进程执行的时间(11)COMMAND:执行的指令名称(c)查看进程家谱命令:pstree LINUX操作系统3.进程优先级管理(1)启动进程时设定优先权使用nice指令启动进程,可以设定进程的优先权优先权:范围-20~19,正值越大优先权越低,负值越小优先权越高,默认值为0。示例:nice-5moreselect_sort.c&(优先级+5)nice--10moretree.c&(优先级-10)(2)显示优先权ps-le(NI字段为优先级) LINUX操作系统4.管理执行中的进程(1)指定进程renice-101921(调整1921号进程的优先级至-10)(2)指定用户renice5-utom(调整用户tom的进程的优先级至+5) LINUX操作系统5.终止进程(1)终止进程语法:kill[终止信号]PID示例:kill1022(2)终止信号(signal)默认终止信号:15强制终止信号:9示例:kill-91020 LINUX操作系统例2.获得实际用户id、有效用户id、实际组id、有效组id实际用户:shell的登录用户有效用户:可执行程序的属主用户实际组:实际用户所在组有效组:有效用户所在组注:用户id,组id相关文件—/etc/passwd LINUX操作系统补充知识——SUID与SGIDsuid/sgid是做什么的?为什么会有suid位呢?要想明白这个,先让我们思考个问题:如何让每个用户更改自己的密码?用户修改密码,是通过运行命令passwd来实现的。最终必须要修改/etc/passwd文件,而passwd的文件的属性是:#ls-l/etc/passwd-rw-r--r--1rootroot2520Jul1218:25passwd LINUX操作系统我们可以看到passwd文件只有对于root用户是可写的,而对于所有的他用户来说都是没有写权限的。那么一个普通的用户如何能够通过运行passwd命令修改这个passwd文件呢? LINUX操作系统为了解决这个问题,SUID/SGID便应运而生,而且AT&T对它申请了专利。SUID和SGID是如何解决这个问题呢?首先,我们要知道一点:进程在运行的时候,有一些属性,其中包括实际用户ID,实际组ID,有效用户ID,有效组ID等。实际用户ID和实际组ID标识我们是谁,谁在运行这个程序,一般这2个字段在登录时决定,在一个登录会话期间,这些值基本上不改变。 LINUX操作系统而有效用户ID和有效组ID则决定了进程在运行时的权限。内核在决定进程是否有文件存取权限时,是采用了进程的有效用户ID来进行判断的。知道了这点,我们来看看SUID的解决途径:当一个程序设置了为SUID位时,内核就知道了运行这个程序的时候,应该认为是文件的所有者在运行这个程序。即该程序运行的时候,有效用户ID是该程序的所有者。 LINUX操作系统举个例子:[root@teacherbin]#ls-lpasswd-r-s--s--x1rootroot16336Feb142003passwd虽然你以tom登录系统,但是当你输入passwd命令来更改密码的时候,由于passwd设置了SUID位,因此虽然进程的实际用户ID是tom对应的ID,但是进程的有效用户ID则是passwd文件的所有者root的ID,因此可以修改/etc/passwd文件。设置SUID的方法:chmodu+sfilename LINUX操作系统intgetuid()返回实际用户idintgeteuid()返回有效用户idintgetgid()返回实际组idintgetegid()返回有效组id LINUX操作系统例2.获得实际用户id、实际用户id、实际组id、有效组id程序名称:priuds.c LINUX操作系统例3.获得用户名、用户信息函数:char*getlogin()功能:返回程序的登录用户名字符串函数:structpasswd*getpwnam(char*login)登录名为参数返回值为指向登录名对应的passwd记录的指针。 LINUX操作系统passwd结构体structpasswd{char*pw_name;/*username*/char*pw_passwd;/*userpassword*/uid_tpw_uid;/*userid*/gid_tpw_gid;/*groupid*/char*pw_gecos;/*realname*/char*pw_dir;/*homedirectory*/char*pw_shell;/*shellprogram*/}; LINUX操作系统例3.获得用户名、用户、用户组信息程序名称:getname.c LINUX操作系统例4.获得进程的用户时间和系统时间clock_ttimes(structtms*t)取出当前进程所用时间放入t指向的structtms结构体。返回值为系统自举后经过的时钟滴答数。 LINUX操作系统structtms{clock_ttms_utime;/*UserCPUtime*/clock_ttms_stime;/*SystemCPUtime*/clock_ttms_cutime;/*UserCPUtimeofchildren*/clock_ttms_cstime;/*SystemCPUtimeofchildren*/} LINUX操作系统例4.获得进程的用户时间和系统时间。程序名称:resusg1.c LINUX操作系统例5.利用getrusage函数获得资源利用信息程序名称:resusg2.c LINUX操作系统相关知识:有两种类型的内存失效:次要失效和主要失效。(1)当CPU必须访问主存(RAM)而不是从L2或L1高速缓存、CPU的片上或高速缓冲存储器中读取数据时,就发生了次要失效。出现这种失效的原因是因为CPU需要的代码或数据不在寄存器或高速缓存中。(2)当进程因所需要代码或数据不在RAM中而必须从磁盘读取数据时就发主要失效(majorfault)。ru_nswap保存了因出现主要失效而必须从磁盘读取的内存页面数量。 LINUX操作系统例6.使用system函数#includeintsystem(constchar*string);功能:生成一个shell进程,由shell解释执行string中的命令行。程序名称:system.c LINUX操作系统例7.创建子进程——fork()#includepid_tfork(void);功能:该调用产生一个子进程并在父进程和子进程中分别返回,在子进程中返回值为0,在父进程中返回值为子进程的进程号。程序名称:child.c LINUX操作系统ParentprocessChildprocess LINUX操作系统例8.使用execveexec()功能:执行一个文件#includeintexecl(path,arg0,...,argn)char*path,*arg0,...,*argn;intexecve(path,argv,envp)char*path,*argv[],*envp[];注:envp用于传递环境变量。 LINUX操作系统说明:这是一个系统调用族,用于将一个新的程序调入本进程所占的内存,并覆盖之,产生新的内存进程映象。新的程序可以是可执行文件或SHELL批命令。程序名称:execve.c LINUX操作系统例9:使用waitpidwaitpid()功能:等待指定进程号的子进程的返回语法:#include#includepid_twaitpid(pid,stat_loc,options)pid_tpid;//子进程号int*stat_loc;//存放子进程状态的单元地址int*options;//通常置0程序名称:waiter.c LINUX操作系统例10:使用abort函数#includevoidabort(void)功能:异常地终止一个程序。碰到内存严重不足这样的错误时使用,它可以产生内存转储(coredump),供调试器分析程序崩溃的原因。程序名称:abort.c LINUX操作系统4.2Linux编程—多线程例1:基本的pthread函数例2:取消线程例3:互斥的基本使用 LINUX操作系统线程的概念(1)同一进程内可以有多个并发执行的流程,每个流程称为一个线程,他们共享进程的地址空间。(2)线程为最小的调度单位,进程只是资源分配单位。(3)由内核进行调度的线程称为内核级线程。(4)由用户空间的线程库调度的线程为用户级线程。(5)在内核地址空间运行的线程称为内核线程。(6)Linux线程为内核级线程,通过共享同一地址空间的进程实现。 LINUX操作系统例1:基本的pthread函数#includeintpthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*startroutine)(void*),void*arg);功能:创建线程,thread为新线程标识符,attr指定新线程属性,startroutine为新线程起点,arg为传给新线程的参数。 LINUX操作系统#includeintpthread_join(pthread_tth,void**thread_return);功能:挂起当前线程,直至th指定的线程结束为止,th线程的返回值如果不是NULL,则保存在thread_return指向的地址中。 LINUX操作系统例1:基本的pthread函数程序名称:thrdcreat.c LINUX操作系统例2:取消线程#includeintpthread_cancel(pthread_tthread);功能:撤销thread指定的线程 LINUX操作系统#includeintpthread_setcancelstate(intstate,int*oldstate);功能:设置线程撤销状态为允许或不允许,state为PTHREAD_CANCEL_ENABLE时允许自己被撤销,为PTHREAD_CANCEL_DISABLE时不允许自己被撤销,旧状态保存到oldstate指向的单元。 LINUX操作系统例2:取消线程程序名称:thrdcancel.c LINUX操作系统例3:互斥的基本使用互斥锁定义:pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;#includeintpthread_mutex_lock(pthread_mutex_t*mutex);对mutex上锁,成功时返回,不成功时阻塞 LINUX操作系统intpthread_mutex_try_lock(pthread_mutext_t*mutex)对mutex上锁,不管是否成功都立即返回,返回值表明成功与否.intpthread_mutex_unlock(pthread_mutext_t*mutext)对mutex解锁 LINUX操作系统例3:互斥的基本使用程序名称:mutex.c

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

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

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