有哪些做共享充电宝的网站,终端安全管理系统,wordpress插件商品对比,wordpress如何接入visa支付宝进程间通信#xff08;IPC#xff09;#xff1a;理论与实现 大家好#xff0c;我是微赚淘客系统3.0的小编#xff0c;是个冬天不穿秋裤#xff0c;天冷也要风度的程序猿#xff01;在本文中#xff0c;我们将深入探讨进程间通信#xff08;IPC#xff09;的理论基础… 进程间通信IPC理论与实现 大家好我是微赚淘客系统3.0的小编是个冬天不穿秋裤天冷也要风度的程序猿在本文中我们将深入探讨进程间通信IPC的理论基础并通过多种编程语言展示其实现方法。 进程间通信的基本概念 进程间通信Inter-Process CommunicationIPC是指在操作系统中不同进程之间交换数据和信息的机制。IPC的主要目的是实现进程间的同步与数据共享常见的IPC机制包括管道、消息队列、共享内存、信号量和套接字等。 管道Pipe 管道是一种半双工的通信方式数据只能在一个方向上传输通常用于父子进程间的通信。在Unix/Linux系统中使用pipe()系统调用创建管道。 登录后复制 #include stdio.h
#include unistd.h
#include string.hint main() {int fd[2];pipe(fd);pid_t pid fork();if (pid 0) { // 子进程close(fd[0]);char message[] Hello from child;write(fd[1], message, strlen(message) 1);close(fd[1]);} else { // 父进程close(fd[1]);char buffer[100];read(fd[0], buffer, sizeof(buffer));printf(Parent received: %s\n, buffer);close(fd[0]);}return 0;
} 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24. 消息队列Message Queue 消息队列是一种消息传递机制允许进程以消息的形式进行通信。消息队列提供了消息的有序性和缓冲能力。在POSIX系统中使用msgget、msgsnd和msgrcv等系统调用。 登录后复制 #include stdio.h
#include sys/ipc.h
#include sys/msg.h
#include string.hstruct msg_buffer {long msg_type;char msg_text[100];
};int main() {key_t key ftok(progfile, 65);int msgid msgget(key, 0666 | IPC_CREAT);struct msg_buffer message;if (fork() 0) { // 子进程message.msg_type 1;strcpy(message.msg_text, Hello from child);msgsnd(msgid, message, sizeof(message), 0);} else { // 父进程msgrcv(msgid, message, sizeof(message), 1, 0);printf(Parent received: %s\n, message.msg_text);msgctl(msgid, IPC_RMID, NULL);}return 0;
} 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27. 共享内存Shared Memory 共享内存允许多个进程直接访问同一块内存区域是最快的IPC方式之一。在POSIX系统中使用shmget、shmat和shmdt等系统调用。 登录后复制 #include stdio.h
#include sys/ipc.h
#include sys/shm.h
#include string.hint main() {key_t key ftok(shmfile, 65);int shmid shmget(key, 1024, 0666 | IPC_CREAT);char *str (char*) shmat(shmid, (void*)0, 0);if (fork() 0) { // 子进程strcpy(str, Hello from child);shmdt(str);} else { // 父进程wait(NULL);printf(Parent received: %s\n, str);shmdt(str);shmctl(shmid, IPC_RMID, NULL);}return 0;
} 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22. 信号量Semaphore 信号量是一种用于进程间同步的机制通常用于解决资源共享问题。在POSIX系统中使用semget、semop和semctl等系统调用。 登录后复制 #include stdio.h
#include sys/ipc.h
#include sys/sem.hunion semun {int val;struct semid_ds *buf;unsigned short *array;
};int main() {key_t key ftok(semfile, 65);int semid semget(key, 1, 0666 | IPC_CREAT);union semun sem_union;sem_union.val 1;semctl(semid, 0, SETVAL, sem_union);if (fork() 0) { // 子进程struct sembuf sb {0, -1, 0}; // P操作semop(semid, sb, 1);printf(Child in critical section\n);sleep(2);printf(Child leaving critical section\n);sb.sem_op 1; // V操作semop(semid, sb, 1);} else { // 父进程struct sembuf sb {0, -1, 0}; // P操作semop(semid, sb, 1);printf(Parent in critical section\n);sleep(2);printf(Parent leaving critical section\n);sb.sem_op 1; // V操作semop(semid, sb, 1);semctl(semid, 0, IPC_RMID, sem_union);}return 0;
} 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38. 套接字Socket 套接字用于网络通信也可以用于本地进程间通信。以下是一个使用套接字的IPC示例 登录后复制 import socket
import osdef child():s socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)s.connect(/tmp/socket)s.sendall(bHello from child)s.close()def parent():if os.path.exists(/tmp/socket):os.remove(/tmp/socket)s socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)s.bind(/tmp/socket)s.listen(1)conn, _ s.accept()data conn.recv(1024)print(Parent received:, data.decode())conn.close()s.close()os.remove(/tmp/socket)if __name__ __main__:if os.fork() 0:child()else:parent() 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29. 在这个例子中我们使用UNIX域套接字在父子进程间传递消息。 Java中的进程间通信 在Java中进程间通信可以使用套接字或文件系统。以下是一个使用套接字的简单示例 登录后复制 package cn.juwatech.ipc;import java.io.*;
import java.net.*;public class SocketExample {public static void main(String[] args) throws IOException {if (args.length 0 args[0].equals(server)) {ServerSocket serverSocket new ServerSocket(5000);Socket socket serverSocket.accept();BufferedReader input new BufferedReader(new InputStreamReader(socket.getInputStream()));System.out.println(Server received: input.readLine());socket.close();serverSocket.close();} else {Socket socket new Socket(localhost, 5000);PrintWriter output new PrintWriter(socket.getOutputStream(), true);output.println(Hello from client);socket.close();}}
} 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22. 在这个例子中服务器和客户端通过套接字通信服务器接收并打印客户端发送的消息。 总结 进程间通信是操作系统和并发编程中的重要概念通过不同的IPC机制可以实现进程之间的数据交换与同步。本文展示了多种编程语言中常见的IPC实现方法为读者提供了丰富的参考示例。 原创作者: szk123456 转载于: https://blog.51cto.com/szk123456/11803806