首页 > 系统相关 >进程间通信(4)-信号量

进程间通信(4)-信号量

时间:2024-04-04 09:15:58浏览次数:13  
标签:信号量 int 间通信 semaphore 进程 sem include

Linux 中的信号量通常指的是进程间通信(IPC)中的一种机制,用于实现进程之间的同步和互斥。在 Linux 中,主要有两种类型的信号量:System V 信号量和 POSIX 信号量。

1. System V 信号量

System V 信号量是最早引入 Linux 的一种进程间通信机制,它使用 semget、semctl 和 semop 等函数进行操作。
创建或获取信号量集:int semget(key_t key, int num_sems, int sem_flags);
控制信号量集:int semctl(int semid, int sem_num, int cmd, ...);
对信号量集进行操作:int semop(int semid, struct sembuf *sops, size_t nsops);
 

2. POSIX 信号量

POSIX 信号量是一种较新的信号量实现,它更加简单和易用,并且在使用上更加符合现代编程习惯。
创建或打开信号量:sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);
关闭信号量:int sem_close(sem_t *sem);
销毁信号量:int sem_unlink(const char *name);
等待(阻塞)信号量:int sem_wait(sem_t *sem);
增加信号量的值:int sem_post(sem_t *sem);
POSIX 信号量更适合于现代的多线程应用程序和多进程应用程序,因为它提供了更简单的接口和更好的可移植性。  

下面的demo以POSIX信号量举例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/wait.h>

int main() {
    sem_t *semaphore;

    // 创建或打开命名信号量
    semaphore = sem_open("/my_semaphore", O_CREAT | O_EXCL, S_IRUSR | S_IWUSR, 0);
    if (semaphore == SEM_FAILED) {
        perror("sem_open");
        exit(EXIT_FAILURE);
    }

    // 创建子进程1:增加信号量的值
    pid_t pid1 = fork();
    if (pid1 == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    } else if (pid1 == 0) { // 子进程1
        printf("Child Process 1: Incrementing semaphore\n");
        for(int i = 0; i < 5; i++) {
            printf("%d seconds before sem_post \n", 5 - i);
            sleep(1);
        }
        sem_post(semaphore); // 增加信号量的值
        exit(EXIT_SUCCESS);
    }

    // 创建子进程2:等待信号量的值达到一定条件
    pid_t pid2 = fork();
    if (pid2 == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    } else if (pid2 == 0) { // 子进程2
        printf("Child Process 2: Waiting for semaphore\n");
        sem_wait(semaphore); // 等待信号量的值达到一定条件
        printf("Child Process 2: Semaphore reached, executing operation\n");
        exit(EXIT_SUCCESS);
    }

    // 等待子进程结束
    wait(NULL);
    wait(NULL);

    // 关闭和销毁信号量
    sem_close(semaphore);
    sem_unlink("/my_semaphore");

    return 0;
}
 

执行结果如下:

0  

标签:信号量,int,间通信,semaphore,进程,sem,include
From: https://www.cnblogs.com/lethe1203/p/18113883

相关文章

  • 关于多信号量打拍的方法讨论
    在实际工作中,由于时序的原因必须对相关信号打拍(用D触发器实现)以满足设计要求。通常思路写法,如下示例代码:always@(posedgeclkornegedgerst_n)begin:FF_PROif(!rst_n)beginpkt_vld_ff1<=1'b0;pkt_vld_ff2<=1'b0;pkt_sop_ff1<=......
  • nodejs守护进程 PM2
    nodejs守护进程PM2 概述PM2是用于Node.js应用程序的生产环境进程管理器,内置负载均衡器。它允许你将应用程序持续运行,无需停机重新加载,并简化常见的系统管理任务。官方网站 Github特性进程管理:PM2可以启动、停止和重启Node.js应用程序进程,确保应用程序一直处于运行......
  • setrlimit函数限制进程资源
    setrlimit设置参数满足structrlimit{rlim_trlim_cur;//软限制rlim_trlim_max;//硬限制}可以设置的参数:RLIMIT_AS:进程总的可用的存储空间的大小。此外,自动堆栈扩展也将失败(并生成一个SIGSEGV,当没有备用堆栈可用时,它会终止进程)RLIMIT_CORE:核心文件的最大......
  • 了解进程
    了解进程1.什么是进程进程是一个跑起来的应用程序员进程也是操作系统分配资源的基本单位 2.如何管理进程操作系统如何管理进程?描述:使用结构体(C语言的结构体)来描述进程属性,操作系统基本上都是C/C++来写的。用来描述进程的这个结构体叫做PCB(进程控制块)......
  • Linux中批量杀进程的方法(转)
    一、使用awk批量杀进程的命令:ps-ef|grephello|grep-vgrep|awk'{print"kill-9"$2}'|sh说明:ps-ef|grephello|grep-vgrep#列出了当前主机中运行的进程中包含hello关键字的进程ps-ef|grephello|grep-vgrep|awk'{print"kill-9"$2}'......
  • 信号量
    二值信号量SemaphoreHandle_tsem_handle;sem_handle=xSemaphoreCreateBinary();staticvoidsend_Task(void*pvParameters){while(1){xSemaphoreGive(sem_handle);vTaskDelay(1000);}}staticvoidreceive_Task(void*pvPara......
  • Day 06 Linux的进程管理
    相关定义程序二进制文件,静态/usr/sbin/httpd,/usr/sbin/sshd,程序占用磁盘空间程序的两种状态:running和dead进程是程序运行的过程,动态,有生命周期的,可以产生和消亡的(进程是已启动的可执行程序的运行实例,实例即运行可执行程序),进程占用CPU和内存mem。父进程程序运行时产......
  • 进程调度-死锁-存储管理-固定分页分段
    进程调度进程调度方式是指当有更高优先级的进程到来时如何分配CPU。分为可剥夺和不可剥夺两种,可剥夺指当有更高优先级进程到来时,强行将正在运行进程的CPU分配给高优先级进程;不可剥夺是指高优先级进程必须等待当前进程自动释放CPU。在某些操作系统中,一个作业从提交到完成需要经......
  • 进程、线程和进程间的通信
    技术笔记!前言一、概念1.程序:存放在磁盘上的指令和数据的有序集合(文件),静态的。2.进程:执行一个程序所分配的资源的总称;进程是程序的一次执行过程;        动态的,包括创建、调度、执行和消亡;3.进程和程序内容区别:BSS段:通常是指用来存放程序中未初始化的......
  • 线程间通信之wait和notify
    synchronized解释:java语言的一个关键字作用:实现同步机制,控制多线程的访问,确保同一时刻只有一个线程可以进入临界区执行同步代码。用法:加在代码块上、加在方法上、加在一个对象,原理:不管是那种用法,都会有一个对象(指定的对象、class的实例对象、class对象),这个对象又会一一对应一......