c++ sleep函数_操作系统linux实验--进程/线程相关:C实现

9c0ade39af118c91ae2bf3333c93d89b.png

实验一、进程控制及通信

一、实验目的

1、加深对进程的理解,进一步认识并发执行的实质;2、分析进程争用资源现象;3、掌握Linux进程基本控制;4、掌握Linux系统中的软中断信号和管道通信

二、实验内容

编写程序,演示多进程并发执行和进程软中断、管道通信。父进程建立一个无名管道,再创建子进程1和子进程2;父进程每隔1秒通过管道发送消息(消息个数可设置上限):

I send you x times. (x初值为1,每次发送后做加一操作)

子进程1、2从管道读出信息,并显示在屏幕上;父进程捕捉来中断信号SIGINT(即按Ctrl+C键),然后向两个子进程分别发出信SIGUSR1、SIGUSR2;子进程捕捉到信号后分别输出收到的消息总数和各自终止信息:

Child Process l is Killed by Parent!
Child Process 2 is Killed by Parent!

父进程等待两个子进程终止后,释放管道并输出发送的消息总数后终止

Parent Process is Killed!

三、预备知识

Linux文件编辑:系统配置并调试[ubuntu配置见下文];编辑、编译、执行/调试[简单C文件编译及调试见第二、三个链接]

吃星星的小芒果:VBox虚拟机Ubuntu下载配置全攻略​zhuanlan.zhihu.com
4d1b0a62f8d22b06f1714208201ccad5.png

详细版:

linux下c编程 基础 - konglingbin - 博客园​www.cnblogs.com
526cf6fd9bd66130ca90578f58560e82.png

快速上手版:

第一课:Linux控制台C程序的创建与运行​www.jianshu.com
3d8488c1bad2b53c13d7803c7d37ca0a.png
简单指令集总结:

Linux进程管理命令:进程查看;进程终止

进程查看:

ps命令:报告进程标识、用户、CPU时间消耗及其他属性;命令单独使用可以看到前台执行的进程;后台进程可以使用带参数的ps命令(如ps -ax);提供进程的一次性查看,结果不连续;结果数据很精确,但数据量庞大。
top命令:显示CPU占用率为前几位的进程;动态显示,输出结果连续;消耗较多的系统资源。
pstree命令:列出当前的进程,以及它们的树状结构;将当前的执行程序以树状结构显示,弥补ps命令的不足;支持指定特定程序(PID)或使用者(USER)作为显示的起始。

进程终止:终止一个进程或终止一个正在运行的程序

kill命令:根据PID向进程发送信号,缺省操作是停止进程。如果进程启动了子进程,只终止父进程,子进程运行中将仍消耗资源成为“僵尸”进程,可用kill -9强制终止退出。
pkill命令:终止同一进程组内的所有进程。允许指定要终止的进程名称,而非PID
Killall命令:与pkill应用方法类似,直接杀死运行中的程序

Linux进程控制函数:进程创建[pid=fork();];修改进程[函数族exec() :启动另外的进程取代当前的进程];进程属性操作[见下];进程退出[正常/异常];等待进程终止[wait(); waitpid();]

设置进程属性
nice():改变进程执行的优先级
setpgid():将指定进程的组进程设为指定的组识别码
setpgrp():将目前进程的组进程识别码设为目前进程的进程识别码,等价于setpgid(0,0)
setpriority():设置进程、进程组和用户的执行优先权
获取进程属性
getpid():获取目前进程的进程标识
getpgid():获得参数pid指定进程所属的组识别码
getpgrp():获得目前进程所属的组识别号,等价于getpgid(0)
getpriotity():获得进程、进程组和用户的执行优先权

进程的软中断通信:进程的软中断通信——函数的使用

信号机制,提供一种简单的处理异步事件的方法,在一个或多个进程之间传递异步信号
1) SIGHUP 		2) SIGINT 		3) SIGQUIT
4) SIGILL 		5) SIGTRAP 		6) SIGABRT
7) SIGBUS 		8) SIGFPE 		9) SIGKILL
10) SIGUSR1 	11) SIGSEGV 		12) SIGUSR2
13) SIGPIPE 	14) SIGALRM 		15) SIGTERM
16) SIGSTKFLT 	17) SIGCHLD 		18) SIGCONT
19) SIGSTOP
20) SIGTSTP 	21) SIGTTIN 		22) SIGTTOU
23) SIGURG 	24) SIGXCPU 		25) SIGXFSZ
26) SIGVTALRM 	27) SIGPROF 		28) SIGWINCH
29) SIGIO 		30) SIGPWR 		31) SIGSYS 

Linux进程间通信:无名管道和有名管道

无名管道用于具有亲缘关系进程间的通信;管道是半双工的,数据只能单向流动(双方通信需建立两个管道);管道只能用于父子进程或兄弟进程之间;管道对于管道两端的进程而言就是一个文件,并单独构成一种文件系统,存在于内存中;写管道的内容添加在管道缓冲区的末尾,读管道则从缓冲区头部读出。 有名管道在普通管道具备功能基础上,通过给管道命名的方法变成管道文件,允许无亲缘关系进程间通过访问管道文件进行通信。

管道通信的使用:无名管道的使用;命名管道的创建与读写

int 

创建命名管道:

int 

四、代码:

//

实验二、线程控制与同步

一、实验目的

1、了解Linux下线程的概念;2、掌握Linux下线程的基本控制;3、了解Linux环境信号灯机制;4、通过信号灯操作实现线程间的互斥与同步。

二、实验内容

1)线程互斥:编程模拟实现飞机售票

创建多个售票线程;已售票使用公用全局变量;创建互斥信号灯;//或利用互斥锁实现;对售票线程临界区施加P、V操作,售票线程打印售票信息;主进程等待子线程退出,各线程在票卖完时打印售票总数、退出。

2)线程同步

设计并实现一个计算线程、两个打印线程共享一个缓冲区的同步与通信, 程序要求:共享缓冲区使用共享公共变量a;计算线程负责计算(1到100的累加,每次加一个数),结果为偶数由打印线程1打印,奇数由打印线程2打印;主进程等待子线程退出。

三、预备知识

1、Linux下的信号灯及其P、V操作:在Linux中信号灯是一个数据集合,可以单独使用这一集合的每个元素。有关的系统调用命令:

semget:创建或返回一个被内核指定的整型的信号灯集索引。
semop:执行对信号灯的操作
semctl:执行对信号灯的控制操作

2、Linux线程使用:

1)线程创建

pthread_create

2)线程等待:等待一个线程的结束

pthread_join

3) 线程撤消:

void 

四、代码:

一>售票实验:此实验代码同时实现了互斥锁和PV信号灯,两者可取其一。

//

二>、消费者生产者实验:

//
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值