匿名消息
main.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int main() {
int _pipe[2] = {0,0};
int ret=pipe(_pipe);
if(ret == -1){
perror("create pipe error");
return 1;
}
printf("_pipe[0 is %d, _pipe[1] is %d\n",_pipe[0],_pipe[1]);
pid_t id=fork();
if(id<0){
perror("fork error");
return 2;
}else if(id == 0){
printf("child writting\n");
close(_pipe[0]);
int count=5;
const char *msg="i am from xatu";
while(count--){
write(_pipe[1],msg,strlen(msg));
sleep(1);
}
close(_pipe[1]);
exit(1);
}else{
printf("father reading\n");
close(_pipe[1]);
char msg[1024];
int count=5;
while(count--){
ssize_t s = read(_pipe[0],msg,sizeof(msg)-1);
if(s>0){
msg[s] = '\0';
printf("client# %s\n",msg);
}else{
perror("read error");
exit(1);
}
}
if(waitpid(id,0,NULL) != -1){
printf("wait success\n");
}
}
return 0;
}
命名消息
server.c
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
void testserver(){
int namepipe = mkfifo("myfifo", S_IFIFO|0666);
if(namepipe == -1){
perror("mkfifo error");
exit(1);
}
int fd=open("./myfifo",O_RDWR);
if(fd == -1){
perror("open error");
exit(2);
}
char buf[1024];
while(1){
printf("sendto#");
fflush(stdout);
ssize_t s = read(0,buf,sizeof(buf)-1);
if(s>0){
buf[s-1] = '\0';
if(write(fd,buf,s)==-1){
perror("write error");
exit(3);
}
}
}
close(fd);
}
int main(){
testserver();
return 0;
}
client.c
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
void testclient(){
int fd=open("./myfifo",O_RDWR);
if(fd == -1){
perror("open error");
exit(1);
}
char buf[1024];
while(1){
ssize_t s = read(fd,buf,sizeof(buf)-1);
if(s>0){
printf("client# %s\n",buf);
}else{
perror("read error");
exit(2);
}
}
close(fd);
}
int main(){
testclient();
return 0;
}
消息队列
read.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<string.h>
typedef struct _msg{
long mtype;
char mtext[50];
}MSG;
int main(int argc, char *argv[]){
key_t key;
int msgqid;
key = ftok("./",2015);
msgqid = msgget(key, IPC_CREAT|0666);
if(msgqid == -1){
perror("msgget");
exit(-1);
}
MSG msg;
memset(&msg,0,sizeof (msg));
msgrcv(msgqid,&msg,sizeof(msg)-sizeof(long),(long)10,0);
printf("msg.mtext=%s\n",msg.mtext);
msgctl(msgqid,IPC_RMID,NULL);
return 0;
}
write.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<string.h>
typedef struct _msg{
long mtype;
char mtext[50];
}MSG;
int main(int argc, char *argv[]){
key_t key;
int msgqid;
MSG msg;
key = ftok("./",2015);
msgqid = msgget(key, IPC_CREAT|0666);
if(msgqid == -1){
perror("msgget");
exit(-1);
}
msg.mtype = 10;
strcpy(msg.mtext,"hello hc");
msgsnd(msgqid,&msg,sizeof(msg)-sizeof(long),0);
return 0;
}
共享内存
IPC中最快最有效率的方式,要注意多个进程对于给定存储区的访问是互斥的
常用的函数有ftok(分配键值)和shmget
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<string.h>
#include<sys/shm.h>
#define BUFSZ 1024
int main(int argc, char *argv[]){
int shmid;
key_t key;
key = ftok("./",2015);
if(key==-1){
perror("ftok");
}
shmid = shmget(key, BUFSZ, IPC_CREAT|0666);
if(shmid<0){
perror("shmget");
exit(-1);
}
return 0;
}
常用函数shmat、shmdt、shmctl
write.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<string.h>
#include<sys/shm.h>
#define BUFSZ 512
int main(int argc,char* argv[]){
int shmid;
int ret;
key_t key;
char *shmadd;
key = ftok(".",2015);
if(key == -1){
perror("ftok");
}
shmid = shmget(key,BUFSZ,IPC_CREAT|0666);
if(shmid<0){
perror("shmget");
exit(-1);
}
shmadd = shmat(shmid, NULL, 0);
if(shmadd<0){
perror("shmat");
_exit(-1);
}
printf("copy data to shared-memory\n");
bzero(shmadd,BUFSZ);
strcpy(shmadd,"how are you,hc\n");
return 0;
}
read.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<string.h>
#include<sys/shm.h>
#define BUFSZ 512
int main(int argc,char *argv[]){
int shmid;
int ret;
key_t key;
char *shmadd;
key = ftok("./",2015);
if(key==-1){
perror("ftok");
}
system("ipcs -m");
shmid = shmget(key, BUFSZ,IPC_CREAT|0666);
if(shmid<0){
perror("shmget");
exit(-1);
}
shmadd = shmat(shmid, NULL, 0);
if(shmadd<0){
perror("shmat");
exit(-1);
}
printf("data = [%s]\n",shmadd);
ret = shmdt(shmadd);
if(ret<0){
perror("shmdt");
exit(1);
}else{
printf("deleted shared-memory\n");
}
shmctl(shmid,IPC_RMID,NULL);
system("ipcs -m");
return 0;
}