题目描述:
操作系统为进程提供了必要的隔离,使得进程内部获得“封闭”的“可再现”执行环境。但是也有很多场合需要进程间交互、协作完成任务,这就需要进程间通信手段以及同步手段。通信手段用于进程间的数据交换,而同步手段用于控制各自的执行步伐形成前后因果或互斥的执行关系。本次实训,同学们将观察和感受Linux提供的各种进程间通信手段。
第一关:创建共享内存
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define BUFSZ 4096
int main(int argc, char* argv[])
{
//*****************Begin***********************
key_t key=ftok("keyfile",0);
shmget(key,BUFSZ,IPC_CREAT);
//*****************End*************************
system("ipcs -m >temp"); //执行ipcs -m 命令,显示系统的共享内存信息,此句不可以删除。
return 0;
}
第二关:读写共享内存
read.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main( int argc, char* argv[])
{
int shm_id;
char* shm_buf;
if (argc != 2) {
printf("USAGE:atshm <identifier>\n");
exit(1);
}
shm_id = atoi(argv[1]);
//--------------Begin--------------
void *s=shmat(shm_id,0,0);
system("ipcs -m > read_attach");
printf("%s\n",(char*)s);
shmdt(s);
system("ipcs -m >read_detach");
//---------------End----------------
exit(0);
}
write.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
int shm_id;
char* shm_buf;
if (argc != 2) {
printf("USAGE:atshm <identifier>");
exit(1);
}
shm_id = atoi(argv[1]);
//----------------Begin------------------
void *s=shmat(shm_id,0,0);
system("ipcs -m >write_attach");//将当前进程和共享内存建立映射之后,执行该代码;不可删除
char *t="Hello shared memory!";
memcpy(s,t,strlen(t)+1);
shmdt(s);
system("ipcs -m >write_detach");//将当前进程和共享内存解除映射之后,执行该代码;不可删除
//--------------End-----------------------
exit(0);
}
第三关:POSIX信号量的使用
#include <semaphore.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
int main(int argc, char** argv)
{
//--------------Begin---------------
sem_t *s;
s=sem_open("semfile",O_CREAT,0666,1);
//--------------End-----------------
}