Linux下进程间通信的方法--信号量

这里的信号量主要是在不同的进程之间使用。

需要四个操作

  1. P操作
  2. V操作
  3. 以及通过semctl调用command参数设置SETVAL来初始化信号量,在使用信号量之前必须要这么做.
  4. 并且可以通过semctl调用command设置为IPC_RMID来删除信号量ID:

因为库里没有定义union semun,因此需要自己定义.

用到信号量的三个函数

  1. semget 用来创建一个新信号量或者取得一个已有信号量的键
  2. semop 用来改变信号量的值
  3. semctl 用来直接控制信号量信息,比如semop之前必须先用semctl给个初值
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>

#include<sys/sem.h>

union semun
{
    int val;
    struct semid_ds *buf;
    unsigned short int *array;
    struct seminfo *__buf;
};

static int set_semvalue(void);
static void del_semvalue(void);
static int semaphore_p(void);
static int semaphore_v(void);

static int sem_id;

static int set_semvalue(void)
{
    union semun sem_union;
    sem_union.val=1;
    semctl(sem_id,0,SETVAL,sem_union);
}

static void del_semvalue(void)
{
    union semun sem_union;
    semctl(sem_id,0,IPC_RMID,sem_union);
}

static int semaphore_p(void)
{
    struct sembuf sem_b;
    sem_b.sem_num=0;
    sem_b.sem_op=-1;
    sem_b.sem_flg=SEM_UNDO;//auto release
    semop(sem_id,&sem_b,1);
}

static int semaphore_v(void)
{
    struct sembuf sem_b;
    sem_b.sem_num=0;
    sem_b.sem_op=1;
    sem_b.sem_flg=SEM_UNDO;//auto release
    semop(sem_id,&sem_b,1);
}

//main function
int main(int argc,char *agrv[])
{
    int i;
    int pause_time;
    char op_char=‘O‘;

    srand((unsigned int)getpid());
    sem_id=semget((key_t)1234,1,0666|IPC_CREAT);

    if(argc>1)
    {
        set_semvalue();
        op_char=‘X‘;
        sleep(2);
    }

    for(i=0;i<10;i++)
    {
        semaphore_p();
        printf("%c",op_char);
        fflush(stdout);
        pause_time=rand()%3;
        sleep(pause_time);
        printf("%c",op_char);
        fflush(stdout);

        semaphore_v();
        pause_time=rand()%2;
        sleep(pause_time);
    }

    printf("\n%d - finished\n",getpid());

    if(argc>1)
    {
        sleep(10);
        del_semvalue();
    }

    exit(0);
}

[email protected]:~/myTest./sem1 1 &  
[1] 12839  
[email protected]:~/myTest ./sem1

OOXXOOXXOOXXOOXXOOXXXXOOXXOOXXOOXXOOXXOO

12839 - finished

12840 - finished

[email protected]:~/myTest$

时间: 2024-08-05 18:02:43

Linux下进程间通信的方法--信号量的相关文章

【操作系统之三】Linux下进程间通信-IPC(Inter-Process Communication)

管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信:信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身:linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够

Linux下进程间通信之命名管道(FIFO)

匿名管道的一个不足之处是没有名字,因此,只能用于具有亲缘关系的进程间通信.在命名管道(FIFO)提出后,该限制得到了克服.FIFO不同于pipe在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中.命名管道是一个设备文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够相互通信. FIFO总是按照先进先出的原则工作,第一个被写入的数据将首先从管道中读出. Linux下有两种方式创建FIFO,一是在shell下交互的建立一个命名管道,二是在程序中使用系统函

MATLAB在Linux下的安装方法(待尝试)

有的,windows下,linux下我都用过,matlab的linux版图形界面使用的而是java,操作没有windows版的流畅,或多或少还有点问题,总之,感觉没有windows版好用,同版本的功能都是一样的,据说linux内核效率较高,跑matlab比windows快,但我没感觉出来. 以下是我的安装方法(注意你的matlab版本):软件下载地址:ftp://soft.hit.edu.cn/software/Science/Mathworks.Matlab/MatlabR13Unix/打开终

linux下文件加密方法总结

为了安全考虑,通常会对一些重要文件进行加密备份或加密保存,下面对linux下的文件加密方法做一简单总结: 方法一:gzexe加密这种加密方式不是非常保险的方法,但是能够满足一般的加密用途,可以隐蔽脚本中的密码等信息.它是使用系统自带的gzexe程序,它不但加密,同时压缩文件.示例如下: 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 3

Linux 下正确关机方法

在linux下一些常用的关机/重启命令有shutdown.halt.reboot.及init,它们都可以达到重启系统的目的,但每个命令的内部工作过程是不同的. Linux centos重启命令:init6 1.reboot2.shutdown -r now 立刻重启(root用户使用)3.shutdown -r 10 过10分钟自动重启(root用户使用)4.shutdown -r 20:35 在时间为20:35时候重启(root用户使用) 如果是通过shutdown命令设置重启的话,可以用sh

磁盘设备在 Linux 下的表示方法

在 Linux 系统中磁盘设备文件的命名规则为: 主设备号 + 次设备号 + 磁盘分区号 对于目前常见的磁盘,一般表示为: sd[a-z]x 主设备号代表设备的类型,相同的主设备号表示同类型的设备. 当前常见磁盘的主设备号为 sd. 次设备号代表同类设备中的序号,用 "a-z" 表示. 比如 /dev/sda 表示第一块磁盘,/dev/sdb 表示第二块磁盘. x 表示磁盘分区编号.在每块磁盘上可能会划分多个分区,针对每个分区,Linux 用 /dev/sdbx 表示,这里的 x 表示

linux下定时执行任务的方法

在LINUX中你应该先输入crontab -e,然后就会有个vi编辑界面,再输入0 3 * * 1 /clearigame2内容到里面 :wq 保存退出. 在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间. cron的配置文件称为"crontab",是"cron table"的简写. 一.cron在3个地方查找配置文件:1./var/spool/

Ubuntu Linux下安装软件方法

1.deb包的安装方式 deb是debian系Linux的包管理方式,Ubuntu是属于debian系的Linux发行版,所以默认支持这种软件安装方式,当下载到一个deb格式的软件后,在终端输入这个命令就能安装: sudo dpkg -i *.deb 或者直接双击安装. 2.编译安装方式 (小贴士:使用编译安装前,需要先建立编译环境,使用以下命令建立基本的编译环境:sudo apt-get install build-essential )在linux的世界,有很多软件只提供了源代码给你,需要你

linux下设置进程优先级方法!

Linux系统下提升进程优先级的办法 Linux系统进程的优先级取值:-20 到 19,数越大优先级越低. 可以通过top命令来查看,NI那一列. 改变进程的优先级的方法有两种: www.2cto.com 1,top命令.输入r,然后根据提示输入进程ID,再输入优先级数值. 2,renice命令.renice -n 2 -p 3432.-n,后面是优先级的值:-p,是进程号. 当然,要执行成功,你得有足够的权限才行. ---------------------------------------