别摸我的键盘 的学生作业:
read.c
#include
#include
#include
#include
#include
#include
#define BUF_SIZE 64
#define PATHNAME "."
#define PRO_ID 100
#define SZ 256
int main(int argc, const char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage %s \n",argv[0]);
return -1;
}
key_t key;
int shmid,ret;
void *addr = NULL;
key = ftok(PATHNAME,PRO_ID);
if(key == -1){
perror("[ERROR] key(): ");
exit(EXIT_FAILURE);
}
shmid = shmget(key,SZ,IPC_CREAT|0666);
if(shmid == -1){
perror("shmid(): ");
exit(EXIT_FAILURE);
}
addr = shmat(shmid, NULL, 0);
FILE *f_s = fopen(argv[1], "r");
if (NULL == f_s) {
perror("Error source Fopen():");
return -1;
}
char buf[BUF_SIZE] = {0};
int idx = 0;
size_t s_t_w;
while ((s_t_w = fread(buf, sizeof(char), BUF_SIZE, f_s)) > 0) {
memcpy((char *)addr + idx, buf, s_t_w);
idx += s_t_w;
}
if (idx < SZ) {
((char *)addr)[idx] = '\0';
}
printf("share memory content is %s \n", addr);
fclose(f_s);
shmdt(addr);
if (ret == -1) {
perror("shmdt(): ");
return -1;
}
return 0;
}
write.c
#include
#include
#include
#include
#include
#include
#define BUF_SIZE 64
#define PATHNAME "."
#define PRO_ID 100
#define SZ 256
int main(int argc, const char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage %s \n",argv[0]);
return -1;
}
key_t key;
int shmid,ret;
void *addr = NULL;
key = ftok(PATHNAME,PRO_ID);
if(key == -1){
perror("[ERROR] key(): ");
exit(EXIT_FAILURE);
}
shmid = shmget(key,SZ,IPC_CREAT|0666);
if(shmid == -1){
perror("shmid(): ");
exit(EXIT_FAILURE);
}
addr = shmat(shmid, NULL, 0);
FILE *f_w = fopen(argv[1], "w+");
if (NULL == f_w) {
perror("Error target Fopen():");
return -1;
}
//int len = strlen(addr);
char buf[SZ] = {0};
int idx = 0;
size_t s_t_w;
memcpy(buf, addr, SZ);
fwrite(buf, sizeof(char), strlen(buf), f_w);
fclose(f_w);
shmdt(addr);
shmctl(shmid,IPC_RMID,NULL);
if (ret == -1) {
perror("shmdt(): ");
return -1;
}
return 0;
}