linux系统编程试卷(答案)
- 格式:doc
- 大小:31.50 KB
- 文档页数:9
3.综合题(1)试分别用grep、sed和awk实现:删除文件ifile中以#开始的注释行,并将结果输出的文件ofile;解:grep -v "^#" ifilesed "/^#/d" ifileawk '!/^#/ { print $0 }' ifile(2)设计一个菜单shell程序,要求:①捕获信号1、2、3、15;②当在循环中,当收到信号后在终端上显示:“Received Signal #”,其中#为收到的信号编号。
解:方法有多种,下为其一。
trap "echo I received siganl 1" 1 # 捕获信号1trap "echo I received siganl 2" 2 # 捕获信号2trap "echo I received siganl 3" 3 # 捕获信号3trap "echo I received siganl 15" 15 # 捕获信号15echo "PID: $$" # 显示PIDwhile true # 循环doread x # 读一字符串。
#同时等待信号,此时可通过^C、^\等交互产生信号2和3# 或从其它终端通过kill -Signal PID发来信号if [ -z "$x" ]; then break; fi # 空串时跳出循环,结束程序done。
程序捕获信号1、2、3和15,按回车结束。
(3)设有shell程序内容为:pkg="dhcp"; x=`rpm –qa | grep $pkg`if [ ! -z $x ]; then echo "Package: $pkg has been installed! " else rpm –ivh ${pkg}* #假设程序$pkg的内容在当前目录内存在 fi试写出程序的功能和执行的可能结果。
复习题(仅供参考)linux(一)选择题:)linux内核的稳定版本( B 1.以下哪一个是D. 2.3.20 C. 1.7.18 B. 2.6.17 .A2.5.24。
) A 2.怎样显示当前目录(D. lsC. who A. pwd B. cd。
) D 3.欲把当前目录下的file1.txt 复制为file2.txt,正确的命令是(B. cp file1.txt | file2.txt A. copy file1.txt file2.txtD. cat file1.txt > file2.txt C. cat file2.txt file1.txt”的文件,那么您可以使用的命.txt4. 如果您想列出当前目录以及子目录下所有扩展名为“。
)B 令是(.txt” D. find . “C. ls –d .txt A. ls *.txt B. find . –name “.txt”)。
B 5. 如何删除一个非空子目录/tmp(rf /tmp/* D. rm –C. rm -Ra /tmp/* A. del /tmp/* B. rm -rf /tmp)。
6. 存放用户帐号的文件是(CD. Gshadow C. passwd A. shadow B. group)。
7.下面哪个系统目录中包含Linux使用的外部设备(BD. /homeC. /boot B. /dev A. /bin)可在光标当前所在行下添加一新行B 在vi编辑器中的命令模式下,键入( 8.D. a C. i O (上一行添加一行) B. o A.) C 9.在vi编辑器中的命令模式下,重复上一次对编辑的文本进行的操作,可使用(命令。
D. * A.上箭头 B. 下箭头 C. .Vi编译器包含命令模式、插入模式和末行模式10.删除文件命令为(D)A.mkdir B. move C. mv D. rm11.假设文件fileA的符号链接(又叫软连接)为fileB,那么删除fileA后,下面的描述正确的是( B)A.fileB也随之被删除B. fileB仍存在,但是属于无效文件C. 因为fileB未被删除,所以fileA会被系统自动重新建立D. fileB会随fileA的删除而被系统自动删除12.在给定文件中查找与设定条件相符字符串的命令为( A )A.grep B. gzip C. find D. sort13.从后台启动进程,应在命令的结尾加上符号( A )A.& B. @ C. # D. $14. 如果执行命令#chmod 746 file.txt,那么该文件的权限是( A )。
大学期末考试linux试题及答案大学期末考试Linux试题及答案1. Linux操作系统的特点是什么?答案:Linux操作系统的特点包括开源、多用户、多任务、支持多种文件系统、稳定性和安全性。
2. 如何在Linux系统中查看当前路径?答案:在Linux系统中,可以使用`pwd`命令来查看当前路径。
3. 解释Linux中的硬链接和软链接的区别。
答案:硬链接是直接指向文件数据的引用,而软链接(符号链接)是指向文件路径的引用。
硬链接不能跨文件系统,而软链接可以。
4. 如何查看Linux系统中的进程?答案:可以使用`ps`命令查看当前运行的进程,或者使用`top`命令实时监控系统进程。
5. 在Linux中,如何查找名为"example.txt"的文件?答案:可以使用`find`命令来查找文件,例如`find / -name example.txt`。
6. 解释Linux中的inode的作用。
答案:inode是文件系统中存储文件属性和指向文件数据块的指针的数据结构。
每个文件和目录在文件系统中都有一个唯一的inode。
7. 如何在Linux中创建一个新用户?答案:可以使用`useradd`命令创建新用户,例如`useradd newuser`。
8. Linux中如何查看当前系统的内核版本?答案:可以使用`uname -r`命令查看当前系统的内核版本。
9. 解释Linux中的管道命令的作用。
答案:管道命令允许将一个命令的输出作为另一个命令的输入,从而可以组合多个命令来处理数据。
10. 如何在Linux中查看文件内容?答案:可以使用`cat`、`less`或`more`命令查看文件内容。
11. Linux中如何改变文件的权限?答案:可以使用`chmod`命令改变文件的权限,例如`chmod 644 filename`。
12. 解释Linux中的chroot命令的作用。
答案:`chroot`命令可以将当前shell的根目录改变到指定的目录,用于限制程序运行的环境。
试卷编号01 拟题教研室(或教师)签名教研室主任签名长沙理工大学考试试卷………………………………………………………………………………………………………………课程名称(含档次)linux操作系统课程代号专业层次(本、专)考试方式(开、闭卷)开一、单项选择题(每题2分,共40分)1.Linux系统是一个()的操作系统A.单用户、单任务B.单用户、多任务C.多用户、单任务D.多用户、多任务2.要给文件file1加上其他人可执行属性的命令是()A.chmod a+xB.chown a+xC.chmod o+xD.chown o+x3.配置主机网卡IP地址的配置文件是()A./etc/sysconfig/network-scripts/ifcfg-eth0B./etc/sysconfig/networkC./etc/resolv.confD./etc/host.conf4.Linux系统能够直接读取的分区类型是()A.NTFSB.FAT16C.FAT32D.ext35.下列命令能启动DNS服务的是()A.service named startB./etc/init.d/named startC.service dns startD./etc/init.d/dns restart6. /dev/sdc6分区表示( )A. 第2块IDE硬盘的第6个分区,是逻辑分区B.第3块IDE硬盘的第6个分区,是逻辑分区C. 第3块SCSI硬盘的第6个分区,是逻辑分区D.第3块SCSI硬盘的第2个分区,是逻辑分区7. Linux 下用一条命令创建/A/S/D目录结构的命令是: ( )A. mkdir /A/S/DB. mkdir –p A/S/DC. mkdir –p /A/S/DD. mkdir –r A/S/D8.为了将当前目录下的压缩归档文件myftp.tar.gz解压缩,我们可以使用:( )。
A. tar -xvzf myftp.tar.gzB. tar -xvz myftp.tar.gzC. tar -vzf myftp.tar.gzD. tar -xvf myftp.tar.gz9.比较重要的系统配置资料,一般来说大部分位于( )目录下。
试卷编号10 拟题教研室(或教师)签名教研室主任签名长沙理工大学考试试卷………………………………………………………………………………………………………………课程名称(含档次)linux操作系统课程代号专业层次(本、专) 考试方式(开、闭卷)开一、单项选择题(每题2分,共40分)当安装linux操作系统时将选择下列那一个操作?()A. 选择"图形登录方式" 设定系统开始运行级为4B。
选择"文本登录方式" 设定系统开始运行级为3C。
选择”文本登录方式" 设定系统开始运行级为5D。
选择"图形登录方式” 设定系统开始运行级为32.Linux通过VFS支持多种不同的文件系统。
Linux缺省的文件系统是() A。
VFAT B。
ISO9660 C.Ext系列 D.NTFS3。
关闭linux系统(不重新启动)可使用()命令。
A。
ctrl+alt+del B。
halt C.shutdown —r D。
reboot4。
修改以太网mac地址的命令为().A.ping B.ifconfig C.arp D.traceroute5。
在vi编辑器中的命令模式下,键入()可在光标当前所在行下添加一新行。
A。
〈O> B。
<o〉C。
<i> D.a6。
以下选项中,哪个命令可以关机? ()A。
init 0B. init 1C. init 5D。
init 67.请选择关于/etc/fstab 的正确描述。
()A. 系统启动后,由系统自动产生B. 用于管理文件系统信息C. 用于设置命名规则,是否使用可以用TAB 来命名一个文件D. 保存硬件信息8。
你使用命令“vi /etc/inittab"查看该文件的内容,你不小心改动了一些内容,为了防止系统出问题,你不想保存所修改内容,你应该如何操作() A.在末行模式下,键入:wq B。
在末行模式下,键入:q!C.在末行模式下,键入:x!D.在编辑模式下,键入“ESC”键直接退出vi9.删除文件命令为()A.mkdir B。
linux操作系统考试试卷(含答案)6试卷编号06 拟题教研室(或教师)签名教研室主任签名长沙理工大学考试试卷………………………………………………………………………………………………………………课程名称(含档次)linux操作系统课程代号专业层次(本、专)考试方式(开、闭卷)开一、单项选择题(每题2分,共40分)1.Linux是所谓的“Free Software”,这个“Free”的含义是()A.LINUX不需要付费B.LINUX发行商不能向用户收费C.LINUX可自由修改和发布D.只有LINUX的作者才能向用户收费2.下面关于SHELL的说法,不正确的是()A. 操作系统的外壳B.什么都不是C.是一个命令语言解释器D.一种和C类似的程序语言3.hda2表示()A. IDE0接口上的从盘B.IDE0接口上的第三个逻辑盘C.接口主盘的第二个分区D.什么都不是4.在安装LINUX时,设置从光盘引导需要改变()。
A.CMOS设置B.重新分区C.跳线D.不能把系统改成光盘引导5.以下不属于服务器操作系统的是()。
A.WINDOWS XPB.WINDOWS 2000 SERVERC.LINUXD.UNIX6.若要使用进程名来结束进程,应使用()命令。
A.killB.psC.pssD.pstree7.RED HAT LINUX 9默认使用的文件系统类型为()A. ext2B.ext3C.FATD.swap8.LINUX的系统管理员的账号名为()。
A. AdministratorB.rootC.helloD.wang9.在LINUX中,要查看目录文件清单,可使用()命令。
A.lsB.cdC.loginD.logout10.光盘所使用的文件系统类型为()。
A.ext2B.ext3C.swapD.ISO 966011.以下命令中,可以将用户身份临时改变为root的是()。
A.SUB.suC.loginD.logout12.以下挂载光盘的方法中,不正确的是()。
高级编程笔试题答案一、选择题1.在网络字节序中,所谓”小端"(little endian)说法正确的是( B )A。
高字节数据存放在低地址处,低字节数据存放在高地址处B. 低字节位数据存放在内存低地址处,高字节位数据存放在内存高地址处C。
和编译器相关D. 上述答案都不正确2.C语言中,系统自动打开的文件是( D )A。
二进制文件 B.随机文件C。
非缓冲文件 D.设备文件3.TCP使用( B )进行流量控制.A。
3次握手法 B. 窗口控制机制C。
自动重发机制D。
端口机制4.TCP/IP层IP协议的服务是( C )A。
可靠服务 B. 有确认的服务C. 无连接数据报D. 以上都不对5.对于一个没有设置任何套接口选项的阻塞套接口,调用recv接收对方的数据,对方发送数据前突然断电,下列哪种情况将会发生( A )A. recv永远不会返回B。
recv立刻返回—1C. recv立刻返回0D. recv在等待很长一段时间后返回-16.下列哪些关于套接口选项函数的说法是正确的( C )A。
SO_DONTLINGER选项是让TCP套接口不对数据进行缓存,调用send函数后立刻将数据发送出去;B。
调用SO_RCVBUF和SO_SNDBUF调整TCP窗口的大小;C。
SO_REUSEADDR选项允许套接口绑定在一个已经在使用的地址上;D。
SO_MAX_MSG_SIZE选项获取每次调用TCP套接口send时,所能发送的最大字节数;二、问答题1.fork和vfork的区别?vfork用于创建一个新进程,而该进程的目的是exec一个新程序。
vfork与fork一样都创建一个子进程,但他并不把父进程地址空间完全复制到子进程中,因为子进程通常都会调用exec或(_exit),于是也就不会访问该地址空间.vfork与fork的另一个区别是vfork保证子进程先运行,在它调用exec或_exit 之后父进程才可能被调度运行。
linux试题及答案csdn1. 什么是Linux操作系统?答案:Linux是一种开源的类Unix操作系统,它是基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
Linux内核由Linus Torvalds在1991年首次发布。
2. Linux系统中的文件权限是如何表示的?答案:Linux系统中的文件权限通常由三组数字表示,每组数字代表不同的用户权限。
第一组代表所有者权限,第二组代表组权限,第三组代表其他用户权限。
每组数字由三位构成,分别代表读(4)、写(2)、执行(1)权限,数字相加即为该组权限。
3. 如何在Linux系统中查看当前登录用户?答案:在Linux系统中,可以使用`who`命令来查看当前登录的用户信息。
例如,输入`who`命令后,系统会列出当前登录的所有用户及其登录信息。
4. 解释Linux中的硬链接和软链接。
答案:硬链接是直接指向文件数据的链接,它与原文件共享相同的数据块,删除原文件不会影响硬链接。
软链接(符号链接)类似于Windows中的快捷方式,它是一个指向原文件的指针,删除原文件会导致软链接失效。
5. 在Linux中,如何查找名为“example.txt”的文件?答案:在Linux中,可以使用`find`命令来查找文件。
例如,输入`find / -name example.txt`命令,系统会从根目录开始搜索名为“example.txt”的文件。
6. 解释Linux中的chroot命令及其用途。
答案:chroot命令用于改变当前进程及其子进程的根目录。
通过chroot命令,可以将进程的根目录改变为指定的目录,这通常用于限制程序的运行环境,提高系统安全性。
7. 在Linux中,如何查看当前系统的内核版本?答案:在Linux中,可以使用`uname -r`命令来查看当前系统的内核版本。
该命令会输出当前运行的内核版本号。
8. 解释Linux中的管道命令。
答案:管道命令(|)允许将一个命令的输出作为另一个命令的输入。
linux操作系统期末考试题及答案一、选择题(每题2分,共20分)1. Linux系统中,哪个命令用于查看当前目录下的文件和文件夹?A. lsB. pwdC. cdD. mkdir答案:A2. 在Linux中,如何查看当前使用的是哪个shell?A. echo $SHELLB. echo $HOMEC. echo $PATHD. echo $USER答案:A3. 以下哪个选项不是Linux文件系统的组成部分?A. 文件B. 目录C. 磁盘D. 索引答案:D4. 在Linux中,如何查看一个文件的内容而不编辑它?A. vi 文件名B. cat 文件名C. touch 文件名D. mkdir 文件名5. Linux系统中,哪个命令用于复制文件?A. cpB. mvC. rmD. ln答案:A6. 如何在Linux中查看当前系统的内核版本?A. uname -aB. uname -rC. whoamiD. hostname答案:B7. 在Linux中,哪个命令用于改变当前工作目录?A. pwdB. cdC. lsD. mkdir答案:B8. 如何在Linux中查看当前路径?A. echo $PATHB. pwdC. echo $HOMED. echo $SHELL答案:B9. 在Linux中,哪个命令用于查看当前登录用户?B. whoamiC. usersD. w答案:B10. Linux系统中,哪个命令用于查找文件?A. findB. grepC. locateD. which答案:A二、填空题(每题2分,共20分)1. Linux系统中,使用________命令可以查看当前路径。
答案:pwd2. 在Linux中,________命令用于查看当前登录用户的信息。
答案:who3. 若要在Linux中查看系统运行时间和平均负载,可以使用________命令。
答案:uptime4. 若要在Linux中查看系统资源使用情况,可以使用________命令。
linux复习题(仅供参考)(一)选择题:1.以下哪一个是linux内核的稳定版本( B )A.2.5.24 B. 2.6.17 C. 1.7.18 D. 2.3.202.怎样显示当前目录( A )。
A. pwdB. cdC. whoD. ls3.欲把当前目录下的file1.txt 复制为file2.txt,正确的命令是( D )。
A. copy file1.txt file2.txtB. cp file1.txt | file2.txtC. cat file2.txt file1.txtD. cat file1.txt > file2.txt4. 如果您想列出当前目录以及子目录下所有扩展名为“.txt”的文件,那么您可以使用的命令是( B )。
A. ls *.txtB. find . –name “.txt”C. ls –d .txtD. find . “.txt”5. 如何删除一个非空子目录/tmp( B )。
A. del /tmp/*B. rm -rf /tmpC. rm -Ra /tmp/*D. rm –rf /tmp/*6. 存放用户帐号的文件是(C )。
A. shadowB. groupC. passwdD. Gshadow7.下面哪个系统目录中包含Linux使用的外部设备(B )。
A. /binB. /devC. /bootD. /home8.在vi编辑器中的命令模式下,键入( B )可在光标当前所在行下添加一新行A.O (上一行添加一行) B. o C. i D. a 9.在vi编辑器中的命令模式下,重复上一次对编辑的文本进行的操作,可使用( C )命令。
A.上箭头 B. 下箭头 C. . D. *Vi编译器包含命令模式、插入模式和末行模式10.删除文件命令为(D)A.mkdir B. move C. mv D. rm11.假设文件fileA的符号链接(又叫软连接)为fileB,那么删除fileA后,下面的描述正确的是(B)A.fileB也随之被删除B. fileB仍存在,但是属于无效文件C. 因为fileB未被删除,所以fileA会被系统自动重新建立D. fileB会随fileA的删除而被系统自动删除12.在给定文件中查找与设定条件相符字符串的命令为(A )A.grep B. gzip C. find D. sort13.从后台启动进程,应在命令的结尾加上符号(A )A.& B. @ C. # D. $14. 如果执行命令#chmod 746 file.txt,那么该文件的权限是( A )。
凌阳教育 嵌入式培训系统编程部分测试试题 注:考试为闭卷,程序题需上机操作运行出结果,考试时间为120分钟 一:选择题(本题共4小题,每题3分共12分) 1)下列不是Linux系统进程类型的是( D ) A 交互进程 B 批处理进程 C 守护进程 D 就绪进程(进程状态) 2)以下对信号的理解不正确的是( B ) A 信号是一种异步通信方式 B 信号只用在用户空间进程通信,不能和内核空间交互 C 信号是可以被屏蔽的 D 信号是通过软中断实现的 3)进程有三种状态( C ) A 准备态、执行态和退出态 B 精确态、模糊态和随机态 C 运行态、就绪态和等待态 D 手工态、自动态和自由态 4)不是进程和程序的区别( B) A 程序是一组有序的静态指令,进程是一次程序的执行过程 B 程序只能在前台运行,而进程可以在前台或后台运行 C 程序可以长期保存,进程是暂时的 D 程序没有状态,而进程是有状态的 二:填空题(本题共6小题,2)、3)两题每空四分,其余每空一分。共23分) 1) 列举八种常见的进程间通信方式无名管道、有名管道、消息队列、信号量、共享内存、信号、套接字 网络上两个主机的进程间通信方式为套接字 2) 命名管道比无名管道的优势提供了一个可以访问的路径名,实现没亲缘关系的进程间通信 3) 消息队列比命名管道和无名管道的优势可以按类型实现消息的随机查询,没必要先进先出 4) 按照逻辑结构不同进行数据库划分,Sqlite 数据库属于哪一类关系型数据库 5) 在C语言中操作sqlite数据库,常用的2中方式是sqlite_exec(回调)、sqlite_gettable(非回调) 6) 列举四种进程调度算法先来先调度(FCFS)、短进程优先调度(SPF)、高优先级调度(HPF)、时间片轮转调度 三:问答题(本题共7题,每题5分,共35分) 1) 什么是系统调用?系统调用是通过什么方式陷入内核态的?请写出你对系统调用的理解。什么是文件I/O和标准I/O库?文件I/O和标准I/O库的区别? 系统调用是指操作系统提供给用户程序调用的一组特殊接口,用户程序可以通过这组接口获得操作系统内核提供的服务。 系统调用是通过软件中断方式陷入内核的 linux的文件I/O是由操作系统提供的基本IO服务, 标准I/O库通过封装系统调用,提供了一个到底层I/O的接口。 标准I/O默认采用了缓冲机制,还创建了一个包含文件和缓冲区相关数据的数据结构;文件I/O一般没有采用缓冲模式,需要自己创建缓冲区。一种是标准库封装系统调用而成,更高级 ,一种是系统提供的,比较低级;标准I/O可移植性高、文件I/O可移植性低。 2) 什么是进程?用fork()创建一个子进程时,系统会做什么工作 进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配的单位,不仅是系统内部独立运行的实体也是独立竞争资源的实体。 用fork()时系统会分配子进程一个ID号 然后继承父进程的地址空间,包括进程上下文 进程堆栈 打开的文件描述符等等,他就是父进程的一个复制品。
3) 进程和线程有什么区别? 每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在进程程中,由进程提供多个线程执行的控制。 进程是系统进行资源分配和调度的一个独 立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。
4) 什么是线程的互斥和同步,程序应怎样写才能达到互斥或同步? 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
在写程序时可以用互斥锁和信号量实现线程同步 ,一个线程访问共享资源时给这个资
源上锁其他线程就不能访问了直到上锁的进程释放互斥锁为止。 5) 什么是僵尸进程?孤儿进程?守护进程? 僵尸进程:僵尸进程是指它的父进程已经退出(父进程没有等待(调用wait/waitpid)它),而该进程dead之后没有进程接受,就成为僵尸进程,也就是(zombie)进程。 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
守护进程:是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受
电脑用户的直接操控。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。通常,守护进程没有任何存在的父进程(即PPID=1),且在UNIX系统进程层级中直接位于init之下。守护进程程序通常通过如下方法使自己成为守护进程:对一个子进程调用fork,然后使其父进程立即终止,使得这个子进程能在init下运行。这种方法通常被称为“脱壳” 6) 有3个线程:A、B、C,现要求A先执行,然后B再执行,最后C再执行,之后A->B->C循环执行,请说出大体的思路? 创建3个信号量sem_A、sem_B、sem_C,分别用来给A、B、C 3个线程,启动sem_A信号量的初始值为1,其余2个信号量初始值为0,当主线程创建3个子线程后,因为sem_A的值大于0,所以只有A线程执行相关的代码,B、C线程堵塞在对sem_B、sem_C信号量的p操作; 当A线程执行完相应的代码后,给sem_B信号量加1,之后B线程开始执行相关操作,在此时A线程堵塞在对sem_A信号量的p操作,C线程继续堵塞;当B线程执行完毕相关操作后,给sem_C进行V操作,B线程堵塞,C线程执行相关操作; 以上是从A->B->C线程执行的流程.
7) exit()、_exit()和return()的区别? exit():结束当前的进程,并且会刷新缓存区,关闭没有关闭的文件等 _exit():结束当前的进程,不对缓存区刷新 return: 1:在main函数中会结束当前进程 2:在子函数中,会返回调用当前函数的调用位置,进程从下个C语句开始执行
四:程序题(本小题共3题,每题10分 共30分)
1) 用多线程、信号量实现生产者和消费者的模拟,仓库容量为10,仓库中开始有3件产品,消费者每3秒消费一件产品,生产者每两秒生产一个产品,生产者和消费者不能同时进入仓库(需要互斥) //信号量---线程间通信 //“生产者消费者” 问题 #include #include #include #include #include #define msleep(x)usleep(x*1000) #define PRODUCT_SPEED 3 //生产速度 #define CONSUM_SPEED 1 //消费速度 #define INIT_NUM 3 //仓库原有产品数 #define TOTAL_NUM 10 //仓库容量
sem_t p_sem, c_sem, sh_sem; int num=INIT_NUM;
void product(void) //生产产品 { sleep(PRODUCT_SPEED); }
int add_to_lib() //添加产品到仓库 { num++;//仓库中的产品增加一个 msleep(500); return num; }
void consum() //消费 { sleep(CONSUM_SPEED); }
int sub_from_lib() //从仓库中取出产品 { num--; //仓库中的产品数量减一 msleep(500); return num; }
void *productor(void *arg) //生产者线程 { while(1) { sem_wait(&p_sem);//生产信号量减一
product();// 生产延时 sem_wait(&sh_sem);//这个信号量是用来互斥的 printf("push into! tatol_num=%d\n",add_to_lib()); sem_post(&sh_sem);
sem_post(&c_sem); //消费信号量加一 } } void *consumer(void *arg) //消费者线程 { while(1) {
sem_wait(&c_sem); //消费者信号量减一 sem_wait(&sh_sem); printf("pop out! tatol_num=%d\n",sub_from_lib()); sem_post(&sh_sem);
sem_post(&p_sem);//生产者信号量加一 consum();//消费延时 } }
int main() { pthread_t tid1,tid2; sem_init(&p_sem,0,TOTAL_NUM-INIT_NUM);
sem_init(&c_sem,0,INIT_NUM); sem_init(&sh_sem,0,1); pthread_create(&tid1,NULL,productor,NULL); pthread_create(&tid2,NULL,consumer,NULL);
pthread_join(tid1,NULL); pthread_join(tid2,NULL); return 0; }
2) 编写一个多线程的程序:
要求: 1、创建2个子线程,主进程要传递3个参数给线程1,传递另一个参数给线程2; 2、线程1、线程2中对每个传给线程的参数加1,等线程都执行完毕后,进程打印