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给个初值
<code class=" hljs cpp" style="box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; padding: 0.5em; color: rgb(0, 0, 0); border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; display: block; background-color: transparent !important;"><span class="hljs-preprocessor" style="box-sizing: border-box; color: rgb(136, 0, 0);">#include<unistd.h></span>
<span class="hljs-preprocessor" style="box-sizing: border-box; color: rgb(136, 0, 0);">#include<stdlib.h></span>
<span class="hljs-preprocessor" style="box-sizing: border-box; color: rgb(136, 0, 0);">#include<stdio.h></span>

<span class="hljs-preprocessor" style="box-sizing: border-box; color: rgb(136, 0, 0);">#include<sys/sem.h></span>

<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">union</span> semun
{
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> val;
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">struct</span> semid_ds *buf;
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">unsigned</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">short</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> *<span class="hljs-built_in" style="box-sizing: border-box; font-weight: bold;">array</span>;
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">struct</span> seminfo *__buf;
};

<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">static</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> set_semvalue(<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">void</span>);
<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">static</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">void</span> del_semvalue(<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">void</span>);
<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">static</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> semaphore_p(<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">void</span>);
<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">static</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> semaphore_v(<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">void</span>);

<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">static</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> sem_id;

<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">static</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> set_semvalue(<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">void</span>)
{
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">union</span> semun sem_union;
    sem_union.val=<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">1</span>;
    semctl(sem_id,<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">0</span>,SETVAL,sem_union);
}

<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">static</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">void</span> del_semvalue(<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">void</span>)
{
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">union</span> semun sem_union;
    semctl(sem_id,<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">0</span>,IPC_RMID,sem_union);
}

<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">static</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> semaphore_p(<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">void</span>)
{
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">struct</span> sembuf sem_b;
    sem_b.sem_num=<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">0</span>;
    sem_b.sem_op=-<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">1</span>;
    sem_b.sem_flg=SEM_UNDO;<span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 136, 136);">//auto release</span>
    semop(sem_id,&sem_b,<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">1</span>);
}

<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">static</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> semaphore_v(<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">void</span>)
{
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">struct</span> sembuf sem_b;
    sem_b.sem_num=<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">0</span>;
    sem_b.sem_op=<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">1</span>;
    sem_b.sem_flg=SEM_UNDO;<span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 136, 136);">//auto release</span>
    semop(sem_id,&sem_b,<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">1</span>);
}


<span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 136, 136);">//main function</span>
<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> main(<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> argc,<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">char</span> *agrv[])
{
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> i;
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> pause_time;
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">char</span> op_char=<span class="hljs-string" style="box-sizing: border-box; color: rgb(136, 0, 0);">'O'</span>;

    srand((<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">unsigned</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span>)getpid());
    sem_id=semget((key_t)<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">1234</span>,<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">1</span>,<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">0666</span>|IPC_CREAT);

    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">if</span>(argc><span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">1</span>)
    {
        set_semvalue();
        op_char=<span class="hljs-string" style="box-sizing: border-box; color: rgb(136, 0, 0);">'X'</span>;
        sleep(<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">2</span>);
    }

    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">for</span>(i=<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">0</span>;i<<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">10</span>;i++)
    {
        semaphore_p();
        <span class="hljs-built_in" style="box-sizing: border-box; font-weight: bold;">printf</span>(<span class="hljs-string" style="box-sizing: border-box; color: rgb(136, 0, 0);">"%c"</span>,op_char);
        fflush(stdout);
        pause_time=rand()%<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">3</span>;
        sleep(pause_time);
        <span class="hljs-built_in" style="box-sizing: border-box; font-weight: bold;">printf</span>(<span class="hljs-string" style="box-sizing: border-box; color: rgb(136, 0, 0);">"%c"</span>,op_char);
        fflush(stdout);

        semaphore_v();
        pause_time=rand()%<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">2</span>;
        sleep(pause_time);
    }

    <span class="hljs-built_in" style="box-sizing: border-box; font-weight: bold;">printf</span>(<span class="hljs-string" style="box-sizing: border-box; color: rgb(136, 0, 0);">"\n%d - finished\n"</span>,getpid());

    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">if</span>(argc><span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">1</span>)
    {
        sleep(<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">10</span>);
        del_semvalue();
    }

    <span class="hljs-built_in" style="box-sizing: border-box; font-weight: bold;">exit</span>(<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">0</span>);
}
</code>

jiang@ubuntu:~/myTest./sem1 1 &  
[1] 12839  
jiang@ubuntu:~/myTest
 ./sem1 
OOXXOOXXOOXXOOXXOOXXXXOOXXOOXXOOXXOOXXOO

12839 - finished 
12840 - finished 
jiang@ubuntu:~/myTest$

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值