read.c中代码如下
#include #include #include #include #include #include
void handler_signal(int signum)
{
return;
}
//./a.out .
int main(int argc, const char *argv[])
{
char *addr;
int shm_id;
key_t key;
//捕捉SIGUSR1
if(signal(SIGUSR1,handler_signal) == SIG_ERR)
{
perror("Fail to signal");
exit(EXIT_FAILURE);
}
//先运行
if((key = ftok(argv[1],'k')) < 0)
{
perror("Fail to key");
exit(EXIT_FAILURE);
}
printf("key = %#x.\n",key);
/*
*int shmget(key_t key, size_t size, int shmflg);
*第一个参数:
*1.IPC_PRIVATE,每次都会获得一个新的共享内存,主要用于有亲缘关系的进程
*2.通过ftok函数获得
* key_t key;
* key = ftok(pathname,字符);
*
*第二个参数:
*共享内存大小
*
*第三个参数:
*IPC_CREAT,IPC_EXCL,权限
*/
//如果对应的key的共享内存不存在,创建,然后返回其ID
//如果对应的key的共享内存存在,直接返回ID
if((shm_id = shmget(key,1024,IPC_CREAT | 0666)) < 0)
{
perror("Fail to shmget");
exit(EXIT_FAILURE);
}
printf("shm_id = %d.\n",shm_id);
//映射共享内存
if( ( addr = (char *)shmat(shm_id,NULL,0) ) == (char *)-1 )
{
perror("Fail to shmat");
exit(EXIT_FAILURE);
}
//写自己PID到共享内存
*( (int *)addr ) = getpid();
while(1)
{
//等待被唤醒
pause();
printf("%s.\n",addr);
if(strncmp(addr,"quit",4) == 0)
break;
}
//解除映射
if(shmdt(addr) < 0)
{
perror("Fail to shmdt");
exit(EXIT_FAILURE);
}
//删除共享内存对象
//真正删除:在共享内存映射次数为0的时候,才会删除
if(shmctl(shm_id,IPC_RMID,NULL) < 0)
{
perror("Fail to shmctl");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);;
}
write.c中代码如下
#include #include #include #include #include #include
//./a.out .
int main(int argc, const char *argv[])
{
char *addr;
int shm_id;
key_t key;
int peer_pid;
if((key = ftok(argv[1],'k')) < 0)
{
perror("Fail to key");
exit(EXIT_FAILURE);
}
printf("key = %#x.\n",key);
/*
*int shmget(key_t key, size_t size, int shmflg);
*第一个参数:
*1.IPC_PRIVATE,每次都会获得一个新的共享内存,主要用于有亲缘关系的进程
*2.通过ftok函数获得
* key_t key;
* key = ftok(pathname,字符);
*
*第二个参数:
*共享内存大小
*
*第三个参数:
*IPC_CREAT,IPC_EXCL,权限
*/
//如果对应的key的共享内存不存在,创建,然后返回其ID
//如果对应的key的共享内存存在,直接返回ID
if((shm_id = shmget(key,1024,IPC_CREAT | 0666)) < 0)
{
perror("Fail to shmget");
exit(EXIT_FAILURE);
}
printf("shm_id = %d.\n",shm_id);
//映射共享内存
if( ( addr = (char *)shmat(shm_id,NULL,0) ) == (char *)-1 )
{
perror("Fail to shmat");
exit(EXIT_FAILURE);
}
//从共享内存中读取对方PID
peer_pid = *((int *)addr);
while(1)
{
fgets(addr,1024,stdin);
addr[strlen(addr) - 1] = '\0';
//发信号唤醒对方
kill(peer_pid,SIGUSR1);
}
exit(EXIT_SUCCESS);;
}