一、管道通信
管道是最常用的进程间通信方式之一。管道通信采用先进先出原则,即写入的数据先被读出,没有被读取的数据会被存储在内核缓冲区中。管道通信一般用于有亲缘关系(父子进程或兄弟进程)的进程间通信。
下面是一个简单的管道通信示例:
int main(){ int fd[2]; pid_t pid; char readbuffer[80]; pipe(fd); pid = fork(); if(pid == 0){ //子进程 close(fd[0]); char *msg = "hello, parent process\n"; write(fd[1],msg,strlen(msg)+1); close(fd[1]); } else{ //父进程 close(fd[1]); read(fd[0],readbuffer,sizeof(readbuffer)); printf("message from child process: %s",readbuffer); close(fd[0]); } return 0; }
二、消息队列通信
消息队列是一个消息链表,因此可以向任意进程发送消息。每个消息都有一个类型标识符和一个数据部分,可以通过操作系统提供的函数来发送和接收消息。
下面是一个简单的消息队列通信示例:
int main(){ int msgid; key_t key; struct msgbuf{ long mtype; char mtext[256]; }msg; key = ftok("msgq_file",'b'); msgid = msgget(key,IPC_CREAT | 0666); msg.mtype = 1; strcpy(msg.mtext,"message from process 1\n"); msgsnd(msgid,&msg,sizeof(msg.mtext),0); msgctl(msgid,IPC_RMID,NULL); return 0; }
三、共享内存通信
共享内存是最快的进程间通信方式之一,因为它不涉及到复制数据,而是把数据放置在一个共享的内存区域里。多个进程都可以访问这个区域,用于在进程间共享数据。
下面是一个简单的共享内存通信示例:
int main(){ int shmid; char *shmaddr; key_t key; key = ftok("/dev/null", 1); shmid = shmget(key, 4096, IPC_CREAT | 0666); shmaddr = (char*)shmat(shmid,NULL,0); strcpy(shmaddr, "shared memory message"); printf("message:%s", shmaddr); shmdt(shmaddr); shmctl(shmid,IPC_RMID,NULL); return 0; }
四、信号通信
信号可以被用来通知其他进程某个事件的发生。进程可以定义一个信号处理函数来对信号进行处理。
下面是一个简单的信号通信示例:
#include#include #include void signal_handler(int signo){ if(signo == SIGUSR1){ printf("received SIGUSR1 signal\n"); } } int main(){ int pid; pid = fork(); if(pid == 0){ //子进程 kill(getppid(),SIGUSR1); exit(0); } else{ //父进程 signal(SIGUSR1,signal_handler); pause(); } return 0; }
五、套接字通信
套接字通信是一种在网络上进行进程间通信的方式。套接字可以用于同一台计算机上的进程间通信,也可以用于不同计算机之间的进程间通信。
下面是一个简单的套接字通信示例:
#include#include #include #include #include int main(){ int sockfd; char buffer[1024]; struct sockaddr_in server_addr; sockfd = socket(AF_INET,SOCK_STREAM,0); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); server_addr.sin_addr.s_addr = INADDR_ANY; bind(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr)); listen(sockfd,10); while(1){ int connfd = accept(sockfd,(struct sockaddr*)NULL,NULL); char *msg = "message from server\n"; write(connfd,msg,strlen(msg)); close(connfd); } return 0; }