进程间通信之:实验内容
(3)编译并运行该程序。
(4)另外打开两个虚拟终端,分别键入“cat>in1”和“cat>in2”,接着在该管道中键入相关内容,并观察实验结果。
4.实验结果
实验运行结果与第6章的例子完全相同。
$./pipe_select(必须先运行主程序)
SELECTCALL
selectcall
TESTPROGRAMME
testprogramme
END
end
q/*在终端上输入’q’或’Q’立刻结束程序运行*/
$cat>in1
SELECTCALL
TESTPROGRAMME
END
$cat>in2
selectcall
testprogramme
end
8.7.2共享内存实验
1.实验目的
通过编写共享内存实验,读者可以进一步了解使用共享内存的具体步骤,同时也进一步加深对共享内存的理解。在本实验中,采用信号量作为同步机制完善两个进程(“生产者”和“消费者”)之间的通信。其功能类似于“消息队列”中的实例,详见8.5.2小节。在实例中使用的与信号量相关的函数,详见8.3.3小节。
2.实验内容
该实现要求利用共享内存实现文件的打开和读写操作。
3.实验步骤
(1)画出流程图。
该实验流程图如图8.10所示。
图8.10实验8.6.2流程图
(2)编写代码。
下面是共享内存缓冲区的数据结构的定义。
/*shm_com.h*/
#includeunistd.h>
#includestdlib.h>
#includestdio.h>
#includestring.h>
#includesys/types.h>
#includesys/ipc.h>
#includesys/shm.h>
#defineSHM_BUFF_SZ2048
structshm_buff
{
intpid;
charbuffer[SHM_BUFF_SZ];
};
以下是“生产者”程序部分。
/*sem_com.h和sem_com.c与“信号量”小节示例中的同名程序相同*/
/*producer.c*/
#includeshm_com.h
#includesem_com.h
#includesignal.h>
intignore_signal(void)
{/*忽略一些信号,免得非法退出程序*/
signal(SIGINT,SIG_IGN);
signal(SIGSTOP,SIG_IGN);
signal(SIGQUIT,SIG_IGN);
return0;
}
intmain()
{
void*shared_memory=NULL;
structshm_buff*shm_buff_inst;
charbuffer[BUFSIZ];
intshmid,semid;
/*定义信号量,用于实现访问共享内存的进程之间的互斥*/
ignore_signal();/*防止程序非正常退出*/
semid=semget(ftok(.,'a'),1,0666|IPC_CREAT);/*创建一个信号量*/
init_sem(semid);/*初始值为1*/
/*创建共享内存*/
shmid=shmget(ftok(.,'b'),sizeof(structshm_buff),0666|IPC_CREAT);
if(shmid==-1)
{
perror(shmgetfailed);
del_sem(semid);
exit(1);
}
linux操作系统文章专题:linux操作系统详解(linux不再难懂)数字通信相关文章:数字通信原理
通信相关文章:通信原理
评论