- 论坛徽章:
- 0
|
下面的代码是在flw兄写的代码修改而得,进程1写入数据到buffer,进程2读出来,并对进程1的数据回答,请教进程1如何去读取进程2的回答?如何处理shmwrite?
进程1: //shmwrite
#include<sys/types.h>;
#include<sys/ipc.h>;
#include<sys/shm.h>;
#include<stdlib.h>;
#include<stdio.h>;
#include<string.h>;
#include<openssl/buffer.h>;
int main(void){
key_t key;
int shmid;
pid_t pid;
int ret;
char string[100];
char *shmbuf;
char buffer[100];
key = ftok("/",'J');
if(key == -1){
fprintf(stderr,"ftok() failed!\n" ;
exit(1);
}
shmid = shmget(key,1024,IPC_CREAT|0666);
if(shmid == -1){
fprintf(stderr,"shmget() failed!\n" ;
exit(1);
}
shmbuf = NULL;
shmbuf = shmat(shmid,NULL,0);
if(shmbuf == NULL){
fprintf(stderr,"Attach shm failed!\n" ;
exit(1);
}
pid = fork();
if(pid == -1){
fprintf(stderr,"fork() failed!" ;
}
if(pid >; 0){
printf(" /*共享内存实现进程通信*/\n" ;
bzero(buffer,100);
printf("please write data to shm:" ;
scanf("%s",&buffer);
strcpy(shmbuf,buffer);
fprintf(stderr,"shm write success!\n" ;
}
ret = shmdt(shmbuf);
if(ret == -1){
fprintf(stderr,"shmdt failed!\n" ;
exit(1);
}
exit(1);
}
进程2: //shmread
#include<sys/shm.h>;
#include<sys/ipc.h>;
#include<sys/types.h>;
#include<stdio.h>;
#include<stdlib.h>;
#include<string.h>;
int main(void){
key_t key;
int shmid;
pid_t pid;
int ret;
char string[100];
char *shmbuf;
char buffer[100];
key = ftok("/",'J');
if(key == -1){
fprintf(stderr,"ftok() failed!\n" ;
exit(1);
}
shmid = shmget(key,1024,0666);
if(shmid == -1){
fprintf(stderr,"shmget() failed!\n" ;
exit(1);
}
shmbuf = NULL;
shmbuf = shmat(shmid,NULL,SHM_RDONLY);
if(shmbuf == NULL){
fprintf(stderr,"Attach shm failed!\n");
exit(1);
}
pid = fork();
if(pid == -1){
fprintf(stderr,"fork() failed!");
}
if(pid >; 0){
printf(" /*共享内存实现进程通信!*/\n");
strcpy(buffer,shmbuf);
fprintf(stderr,"Read data from shm...\n");
fprintf(stderr,"Read data:\t%s\n",buffer);
fprintf(stderr,"Read data success!\n");
bzero(buffer,100);
fprintf(stderr,"answer the request: ");
scanf("%s",&buffer);
strcpy(buffer,shmbuf);
fprintf(stderr,"answer success!\n");
}
ret = shmdt(shmbuf);
if(ret == -1){
fprintf(stderr,"shmdt failed!\n");
exit(1);
}
shmctl(shmid,IPC_RMID,NULL);
exit(1);
} |
|