进程间通信之:实验内容

时间:2013-09-13来源:网络

(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);

}

1 2 3

关键词: 进程间通信 实验 管道通信 Linux 操作系统

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版