首页主机资讯CentOS系统中进程间通信方式

CentOS系统中进程间通信方式

时间2025-10-15 20:03:03发布访客分类主机资讯浏览1485
导读:在CentOS系统中,进程间通信(IPC)主要有以下几种方式: 1. 管道(Pipes) 匿名管道(Anonymous Pipes):只能在具有亲缘关系的进程间使用,例如父子进程。 命名管道(Named Pipes, FIFOs):可以在...

在CentOS系统中,进程间通信(IPC)主要有以下几种方式:

1. 管道(Pipes)

  • 匿名管道(Anonymous Pipes):只能在具有亲缘关系的进程间使用,例如父子进程。
  • 命名管道(Named Pipes, FIFOs):可以在任意进程间使用,通过文件系统中的一个特殊文件来实现。

2. 消息队列(Message Queues)

  • 允许进程以消息的形式交换数据。
  • 支持消息的优先级和选择性接收。

3. 共享内存(Shared Memory)

  • 多个进程可以映射到同一块物理内存区域。
  • 需要同步机制来避免竞争条件。

4. 信号量(Semaphores)

  • 用于进程同步,控制对共享资源的访问。
  • 可以用来实现互斥锁(mutexes)和计数信号量。

5. 套接字(Sockets)

  • 提供了一种在不同主机上的进程间通信机制。
  • 支持流式(TCP)和数据报(UDP)两种传输方式。

6. 信号(Signals)

  • 用于通知接收进程某个事件已经发生。
  • 常用于进程控制和错误处理。

7. 内存映射文件(Memory-Mapped Files)

  • 将文件或设备映射到进程的地址空间。
  • 可以像操作普通内存一样读写文件。

8. 文件锁(File Locking)

  • 通过锁定文件来同步对文件的访问。
  • 可以使用fcntl系统调用来实现。

9. 信号槽机制(Signals and Slots)

  • 主要用于Qt框架中的对象间通信。
  • 不是操作系统原生支持的IPC方式。

实现示例

匿名管道

#include <
    stdio.h>
    
#include <
    unistd.h>


int main() {
    
    int pipefd[2];
    
    char buffer[10];


    if (pipe(pipefd) == -1) {
    
        perror("pipe");
    
        return 1;

    }
    

    pid_t pid = fork();

    if (pid == -1) {
    
        perror("fork");
    
        return 1;

    }


    if (pid == 0) {
     // 子进程
        close(pipefd[1]);
     // 关闭写端
        read(pipefd[0], buffer, sizeof(buffer));
    
        printf("Child received: %s\n", buffer);
    
        close(pipefd[0]);

    }
 else {
     // 父进程
        close(pipefd[0]);
     // 关闭读端
        write(pipefd[1], "Hello from parent", 20);
    
        close(pipefd[1]);

    }
    

    return 0;

}
    

命名管道

# 创建命名管道
mkfifo myfifo

# 写入数据
echo "Hello" >
     myfifo &
    

# 读取数据
cat myfifo

共享内存

#include <
    sys/ipc.h>
    
#include <
    sys/shm.h>
    
#include <
    stdio.h>
    
#include <
    stdlib.h>


int main() {
    
    key_t key = ftok("shmfile", 65);
    
    int shmid = shmget(key, 1024, 0666|IPC_CREAT);
    
    char *str = (char*) shmat(shmid, (void*)0, 0);
    

    strcpy(str, "hello world");
    
    printf("Shared memory segment: %s\n", str);
    

    shmdt(str);
    
    shmctl(shmid, IPC_RMID, NULL);
    

    return 0;

}
    

信号量

#include <
    sys/ipc.h>
    
#include <
    sys/sem.h>
    
#include <
    stdio.h>


union 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 arg;
    
    arg.val = 1;
     // 初始化信号量为1
    semctl(semid, 0, SETVAL, arg);


    // P操作(等待信号量)
    struct sembuf sb = {
0, -1, SEM_UNDO}
    ;
    
    semop(semid, &
    sb, 1);
    

    printf("Semaphore value: %d\n", semctl(semid, 0, GETVAL, arg));
    

    // V操作(释放信号量)
    sb.sem_op = 1;
    
    semop(semid, &
    sb, 1);
    

    semctl(semid, 0, IPC_RMID, arg);
    

    return 0;

}
    

这些示例展示了如何在CentOS系统中使用不同的IPC机制。根据具体需求选择合适的通信方式。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: CentOS系统中进程间通信方式
本文地址: https://pptw.com/jishu/727325.html
CentOS下recycle在哪找 怎样结束CentOS中的顽固进程

游客 回复需填写必要信息