四川大学 linux 第4章 unix进程管理及进程通信
- 格式:ppt
- 大小:594.00 KB
- 文档页数:152
四川大学期末考试试题(开卷)(2011-2012学年第1学期 B卷)课程号:304011030 课程名称: UNIX 操作系统任课教师:刘循适用专业年级:计算机科学与技术学号:姓名:一. 选择题(30)1.一个已登录UNIX系统的用户,如果想退出系统,但又不影响其它在线用户的正常使用,用下列那种命令?A exitB haltC rebootD shutdown2.下面哪一项是vi的真实特性?A 不是一个全屏的文本编辑器B 在两种模式中操作C 能够用来编辑文本和二进制文件D 能够用于查看图像文件3.为了用户能够查看文件的内容和对它进行修改,用户需要拥有哪种权限?A 读和更改B 读和修改C 读和执行D 读和写4.下面哪个启动的进程是后台进程?A & ls -RB ls -RC ls -R &D ps -f5.下面哪个文件用于UNIX的用户信息帐号等信息管理?A /etc/passwd文件B /usr/passwd文件C /bin/passwd文件D /opt/passwd文件6.如果想要让执行的命令在退出登录后继续执行,可以用下面哪个命令?A exitB nohupC writeD continue7.在UNIX系统中,一个用户需要发送信息给操作系统的所有用户,可以用下面哪个命令?A sendB writeC wallD put8.用下面哪个指令可以显示用户当前的所有作业?A jobsB set jobsC listD set –a9.下面哪个命令可以显示与磁盘和终端I/O有关的统计信息?A iomessageB iostateC iostatD iomes10.在UNIX的环境变量中,哪个变量用来设定用户的默认目录(即用户根目录或家目录),用户登录系统时默认进入该目录?A HOMEB homeC envD ENV11.在UNIX的环境变量中,哪个变量用来设置系统提示符?A PSB PS1C PS2D ps12.下面哪个命令可以显示所有变量,包括环境变量和临时变量?A lsB psC setD grep13.下面哪个命令可以从标准输入读入数据并将读入的数据赋值给变量?A inputB outputC inD read14.在UNIX进程通信中,()只能用于进程同其子进程之间通信。
linux下进程通信的八种方法在Linux下,有多种方法可以实现进程间的通信。
以下是八种常用的进程通信方法:
1. 管道(Pipe):管道是一种半双工通信方式,可用于具有亲缘关系的父子进程之间进行通信。
2. 命名管道(Named Pipe):命名管道也称为FIFO(First In, First Out),它可以在无亲缘关系的进程之间进行通信。
3. 信号(Signal):进程通过发送信号给其他进程来进行通信,例如,某些特定事件发生时,一个进程可以向另一个进程发送一个信号。
4. 消息队列(Message Queue):进程可以通过消息队列发送和接收消息,消息队列提供了一种先进先出的消息传递机制。
5. 共享内存(Shared Memory):多个进程可以共享同一块内存区域,进程可以直接读写该内存区域来进行通信。
6. 信号量(Semaphore):信号量用于进程间的互斥和同步,可以控制对共享资源的访问。
7. 套接字(Socket):套接字是一种网络编程中常用的通信机制,在本地主机或网络上不同主机的进程之间进行通信。
8. 文件锁(File Locking):进程可以使用文件锁来实现对某个文件或资源的独占访问。
一、Unix进程控制1、进程的创建与终止进程是操作系统中活跃着的“生命”,从创建到终止一代又一代,生生不息。
UNIX 系统中创建进程的方法是用系统调用fork()。
调用系统调用 fork()的进程是父进程,所创建的新进程为子进程。
除进程0 之外,系统中所有的进程都是系统调用fork()创建的。
系统调用 fork()的实现过程首先是由内核为新进程在进程表中分配一个表项并给新进程一个唯一的进程标识符PID;然后通过拷贝父进程的进程映象来创建一新进程,新进程将获得其父进程地址空间的一份拷贝;最后增加与该进程相关联的文件表和索引节点表的引用数并将子进程的进程标志返回给父进程,收到父进程返回信号则标志新进程创建完毕。
fork()系统调用生成子进程的步骤见图8.2-1,包含如下步骤:(1)如果系统内存够,则能创建进程;否则调用退出;(2)为要创建的进程分配一个空闲的进程表项和唯一的进程标识符PID;(3)如果进程所在的用户其进程数没超过系统限制,则能创建进程;否则调用退出;(4)设置进程状态为创建,拷贝父进程表项中数据到进程表项中;(5)将当前目录的索引节点和改变的根目录的引用数加 1,文件表中打开文件的引用数加1;(6)拷贝父进程上下文到进程的上下文;(7)如果正在执行的是其父进程则设置进程状态为就绪,否则初始化u 区的计时域。
2、子进程创建后拷贝其父进程的上下文,并且还可用父进程的当前目录和根目录以及已打开的文件,只是这些的引用计数要加1。
3、当父进程创建子进程时希望子进程结束后能把控制返回给父进程,所以子进程不能覆盖父进程给予的控制区。
当进程任务完成后,为了收回进程所占用的系统资源和减少父进程的负担,进程可以用系统调用exit()来实现进程的自我终止。
进程终止可以是正常情况下,也可以在非正常情况下。
有如下几个步骤:(1)关闭进程的软中断信号;(2)如果是与控制终端相连的进程组组长,则向本组进程发出挂起信号。
西安电子科技大学计算机学院实验报告题目:进程通信班级:姓名:学号:内容摘要:一、分析和设计1. 理论分析匿名管道主要用在本地父子进程之间的通信,首先由父进程创建一个匿名管道,在创建成功后,便可以获得匿名管道的读写句柄,然后父进程就可以向匿名管道中写入和读取数据。
要实现父子间通信,就要父进程中创建一个子进程,子进程可以继承和使用父进程的一些句柄。
在创建子进程的过程中,必须将子进程的标准输入句柄设置为父进程的读管道的句柄,子进程的标准输出句柄设置为父进程的写管道的句柄,这样,父子进程之间就可以通信了。
2. 总体设计先由父进程创建一个匿名管道,再由父进程获得读写句柄,构建读写的方式;由父进程创建子进程,实现父进程一样的通信功能。
二、详细实现1、父进程的实现1)消息以及成员函数和成员变量的声明public:afx_msg void OnBnClickedBtnCreatePipe(); //创建匿名管道afx_msg void OnBnClickedBtnWritePipe(); //写匿名管道afx_msg void OnBnClickedBtnReadPipe(); //读匿名管道void ParentReadPipe(void); //定义父进程读匿名管道的成员函数void ParentWritePipe(void); //定义父进程写匿名管道的成员函数void CreateSecurityAttributes(PSECURITY_ATTRIBUTES pSa); //创建SECURITY_ATTRIBUTES 结构的成员函数void CreateStartUpInfo(LPSTARTUPINFO lpStartUpInfo); //创建 STARTUPINFO 结构的成员函数void CreateNoNamedPipe(void); //创建匿名管道的成员函数//分别代表要从匿名管道中读的数据和要写到匿名管道中的数据CString m_CStrReadPipe;CString m_CStrWritePipe;//保存创建匿名管道后所得到的对匿名管道的读写句柄HANDLE hPipeRead;HANDLE hPipeWrite;//保证匿名管道只创建一次BOOL m_PipeIsCreated;2)消息处理函数//创建匿名管道按钮的消息处理函数void CNoNamedPipeParentDlg::OnBnClickedBtnCreatePipe(){if(m_PipeIsCreated == FALSE){this->CreateNoNamedPipe();}}//写入数据到匿名管道中按钮的消息处理函数void CNoNamedPipeParentDlg::OnBnClickedBtnWritePipe(){this->ParentWritePipe();}//从匿名管道中读取数据按钮的消息处理函数void CNoNamedPipeParentDlg::OnBnClickedBtnReadPipe(){this->ParentReadPipe();}//接收数据void CNoNamedPipeParentDlg::ParentReadPipe(void);//发送数据void CNoNamedPipeParentDlg::ParentWritePipe(void)//创建 SECURITY_ATTRIBUTES 结构void CNoNamedPipeParentDlg::CreateSecurityAttributes(PSECURITY_ATTRIBUTES pSa){//这里必须将 bInheritHandle 设置为 TRUE,//从而使得子进程可以继承父进程创建的匿名管道的句柄pSa->bInheritHandle = TRUE;pSa->lpSecurityDescriptor = NULL;pSa->nLength = sizeof(SECURITY_ATTRIBUTES);}//用来初始化新进程的 STARTUPINFO 成员void CNoNamedPipeParentDlg::CreateStartUpInfo(LPSTARTUPINFO lpStartUpInfo) //创建匿名管道void CNoNamedPipeParentDlg::CreateNoNamedPipe(void);2、子进程的实现1)消息以及成员函数和成员变量的声明:protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:afx_msg void OnBnClickedBtnWritePipe();afx_msg void OnBnClickedBtnReadPipe();//保存从父进程得到针对于匿名管道的读写句柄HANDLE hPipeRead;HANDLE hPipeWrite;//分别代表要从匿名管道中读的数据和要写到匿名管道中的数据CString m_CStrWritePipe;CString m_CStrReadPipe;//子进程读取匿名管道void ChildReadPipe(void);//子进程写匿名管道void ChildWritePipe(void);//子进程获取从父进程处继承得到的关于匿名管道的读写句柄void GetReadWriteHandleFromParent(void);//只需要获取一次匿名管道的读写句柄即可BOOL m_IsGettedParentHandle;2)消息处理函数//往匿名管道中写入数据按钮的消息处理函数void CNoNamedPipeChildDlg::OnBnClickedBtnWritePipe(){//如果子进程还没有获得对匿名管道的读写句柄的话需要先获取句柄 this->GetReadWriteHandleFromParent();ChildWritePipe();}//从匿名管道中读取数据按钮的消息处理函数void CNoNamedPipeChildDlg::OnBnClickedBtnReadPipe(){//如果子进程还没有获得对匿名管道的读写句柄的话需要先获取句柄 this->GetReadWriteHandleFromParent();ChildReadPipe();}//从匿名管道读取数据成员函数void CNoNamedPipeChildDlg::ChildReadPipe(void);//往匿名管道中写入数据void CNoNamedPipeChildDlg::ChildWritePipe(void)//需要获取继承自父进程的匿名管道读写句柄void CNoNamedPipeChildDlg::GetReadWriteHandleFromParent(void){if(this->m_IsGettedParentHandle == FALSE){hPipeRead = GetStdHandle(STD_INPUT_HANDLE);hPipeWrite = GetStdHandle(STD_OUTPUT_HANDLE);this->m_IsGettedParentHandle = TRUE;}}三、实验结果启动父进程可执行文件,并单击创建匿名管道按钮,此时会弹出子进程窗口(新建了进程):再在父进程的左边文本框中输入数据,单击写入数据按钮:再在子进程窗口中单击读取数据按钮四、心得体会通过本次试验,更深入的了解了进程间通信中使用管道通信的方法,这种方法只能在父子进程之间通信,不能使用在其他地方,但在本地通信之间效率很高。