linux_c语言实现父子进程共享内存
2017-11-28 14:11
190 查看
具体代码实现部分:
#include<stdio.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<sys/types.h>
extern int etext,edata,end;
int main(int argc,char *argv[ ])
{
int shmid;
int proj_id;
key_t key;
int shm_size;
char *shm_addr,*addr;
pid_t pid;
if(argc!=3){
printf("usage:%s shared_memory_size info\n",argv[0]);
return 1;
}
shm_size=atoi(argv[1]);
proj_id=2;
key=ftok("./",proj_id);
if(key==-1){
perror("cannot generate the ipc key");
return 1;
}
shmid=shmget(key,shm_size,IPC_CREAT | 0660);
if(shmid==-1)
{
perror("cannot create a shared memory segment ");
return 1;
}
addr=(char*)shmat(shmid,NULL,0);
shm_addr=addr;
if(shm_addr==(char*)(-1)){
perror("cannot attach the shared memory to process");
return 1;
}
printf("\n");
printf("==========address information==========\n");
printf("etext address:%x\n",&etext);
printf("edata address:%x\n",&edata);
printf("end address :%x\n",&end);
printf("shared memory segment address:%x\n",shm_addr);
printf("=======================================\n");
strcpy(shm_addr,argv[2]);
printf("the input string is:%s\n",argv[2]);
printf("before fork,int shared memory segment the string is:%s\n",shm_addr);
pid=fork();
if(pid==-1){
perror("cannot creat new process");
return 1;
}else if(pid==0){
printf("in child process,the string is:%s\n",shm_addr);
printf("modify the content in shared memory\n");
*shm_addr +=1;
_exit(0);
}else{
wait(NULL);
printf("after fork,int shared memory segment the string is: %s\n",shm_addr);
if(shmdt(shm_addr)==-1){
perror("cannot release the memory");
return 1;
}
if(shmctl(shmid,IPC_RMID,NULL)==-1){
perror("cannot delete existing shared memory segment");
return 1;
}
}
return 0;
}
然后就是编译运行了:
#gcc -o share_memory share_memory.c
#./share_memory 1024 message_to_shared_memory
#include<stdio.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<sys/types.h>
extern int etext,edata,end;
int main(int argc,char *argv[ ])
{
int shmid;
int proj_id;
key_t key;
int shm_size;
char *shm_addr,*addr;
pid_t pid;
if(argc!=3){
printf("usage:%s shared_memory_size info\n",argv[0]);
return 1;
}
shm_size=atoi(argv[1]);
proj_id=2;
key=ftok("./",proj_id);
if(key==-1){
perror("cannot generate the ipc key");
return 1;
}
shmid=shmget(key,shm_size,IPC_CREAT | 0660);
if(shmid==-1)
{
perror("cannot create a shared memory segment ");
return 1;
}
addr=(char*)shmat(shmid,NULL,0);
shm_addr=addr;
if(shm_addr==(char*)(-1)){
perror("cannot attach the shared memory to process");
return 1;
}
printf("\n");
printf("==========address information==========\n");
printf("etext address:%x\n",&etext);
printf("edata address:%x\n",&edata);
printf("end address :%x\n",&end);
printf("shared memory segment address:%x\n",shm_addr);
printf("=======================================\n");
strcpy(shm_addr,argv[2]);
printf("the input string is:%s\n",argv[2]);
printf("before fork,int shared memory segment the string is:%s\n",shm_addr);
pid=fork();
if(pid==-1){
perror("cannot creat new process");
return 1;
}else if(pid==0){
printf("in child process,the string is:%s\n",shm_addr);
printf("modify the content in shared memory\n");
*shm_addr +=1;
_exit(0);
}else{
wait(NULL);
printf("after fork,int shared memory segment the string is: %s\n",shm_addr);
if(shmdt(shm_addr)==-1){
perror("cannot release the memory");
return 1;
}
if(shmctl(shmid,IPC_RMID,NULL)==-1){
perror("cannot delete existing shared memory segment");
return 1;
}
}
return 0;
}
然后就是编译运行了:
#gcc -o share_memory share_memory.c
#./share_memory 1024 message_to_shared_memory
相关文章推荐
- Linux下共享内存通信实现A进程死循环输出A后被C进程处理输出C
- 共享内存实现父子进程间通讯
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- Linux进程通信---共享内存 代码实现
- linux进程内存共享---实现生产者消费者问题
- Linux 基于IPC机制实现进程间的共享内存处理
- [转] linux下使用mmap实现进程间共享内存
- linux多线程【8】mmap实现父子进程的共享内存通信,用信号量同步
- Linux下利用信号量函数和共享内存函数和C语言实现生产者消费者问题
- linux下通过共享内存在进程之间实现通信(system V)
- Linux 基于IPC机制实现进程间的共享内存处理
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- linux下的多进程通信(IPC)原理及实现方案(管道、队列、信号量、共享内存)
- [Linux管道和IPC]使用信号量和共享内存进行父子进程通信
- 进程通信之内存地址映射与共享,同时如何在Linux0.11下实现共享内存
- 利用共享存储实现父子进程间的通信
- 共享内存实现进程间数据的交换
- 利用共享内存实现进程之间的通讯
- VC 共享内存实现进程间大数据的交换
- 共享内存实现进程间大数据的交换