一、管道通信
管道是最常用的進程間通信方式之一。管道通信採用先進先出原則,即寫入的數據先被讀出,沒有被讀取的數據會被存儲在內核緩衝區中。管道通信一般用於有親緣關係(父子進程或兄弟進程)的進程間通信。
下面是一個簡單的管道通信示例:
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;
}
原創文章,作者:SWRXS,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/333411.html
微信掃一掃
支付寶掃一掃