信号量试验1

作者在 2013-07-20 20:44:54 发布以下内容

=============    信号量      =============


1.  进程1创建信号量集

2.  进程2连接该信号量集,sleep(60)——休眠60秒,之后利用该信号量进行加锁

3.  进程3连接该信号量集,之后将该信号量集删除。


运行过程:利用进程1创建信号量集,利用进程2连接该信号量进行加锁操作,在

          休眠60秒,运行进程3,连接该信号量集,并将该信号量集删除。看看

          进程260秒之后进行的加锁操作————肯定失败,就是要验证这个


追加: 当然可以在进程2中,加锁成功之后做一些操作,之后要删除该信号量集

       在运行进程3,也可以将这么多都至于一个进程中处理。

       要实现进程间通信的同步,就可以使用信号量。

========================================

运行结果:      

终端1

[root@localhost shiyan]# gcc -g sem1.c -o sem1

[root@localhost shiyan]# gcc -g sem2.c -o sem2

[root@localhost shiyan]# gcc -g sem3.c -o sem3

[root@localhost shiyan]#

[root@localhost shiyan]# ./sem1   //运行进程1

semget1  create ok


终端2

[root@localhost shiyan]# ./sem2  //运行进程2

semget  ok   //之后在休眠60秒的时候,去运行进程3

semop lock is errno, errno 22 //休眠60秒之后,由于进程3将该信号量集删除,所以加锁失败

default


终端3

[root@localhost shiyan]# ./sem3  //运行进程3

semget ok !

semctl is ok  //该信号集删除成功

[root@localhost shiyan]#


=========================================












============    进程1     ================

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <sys/sem.h>


int main(){

    int semid1;


    semid1 = semget((key_t)123, 2, IPC_CREAT|0666); //创建信号量集,里面包含两个信号量

    if (-1 == semid1) {

        printf("semget1 create errno\n");

        return 1;

    }else{

        printf("semget1  create ok \n");

    }


    return 0;

}


=========================================























============    进程2     ================

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <sys/sem.h>




static struct sembuf    op_trylock[2] = {  //信号量加锁操作

        { 0, 0, IPC_NOWAIT },

        { 0, 1, SEM_UNDO }

};


int main(){

    int semid;

    int i;

    int flg =-1;


    semid = semget((key_t)123, 0,0);  //连接该信号量集

    if (-1 == semid) {

        printf("semget  errno\n");

        return 1;

}else{

 printf("semget  ok \n");

}


    sleep(60);  //在休眠60秒的时候去运行进程3


  for(i = 0; i <= 2; i++) {  //信号量加锁操作

    if(semop(semid, op_trylock, 2) < 0) {

        printf("semop lock is errno, errno %d \n",errno);

                                switch(errno) {

                                case EAGAIN:  //再试一次加锁

                                printf("EAGAIN  \n");

                                break;

                                case EINTR:  //中断导致加锁失败

                                printf("EINTR \n");

                                break;

                                default :  //其他加锁失败

                                      printf("default  \n");

                                        return -2;

                        }

    }else{

       flg = 1;

       printf("semop is ok\n");

       break;

    }

    usleep(10);

  }


  if(1==flg){

      return 0;

  }


  return 1;

}


=========================================






























============    进程3     ================

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <sys/sem.h>




int main(){

int semid = -1;


    semid = semget((key_t)123,0,0);  //连接该信号集

    if(-1 == semid){

       printf("semget errno !\n");

       return 1;

    }else{

       printf("semget ok !\n");

    }


   if(semctl(semid, 0, IPC_RMID, 0) < 0) {  //删除该信号集

         printf("semctl is errno \n");

         return -1;

    }else{

        printf("semctl is ok\n");

    }


return 0;

}


=========================================

进程间通信 | 阅读 1595 次
文章评论,共0条
游客请输入验证码
最新评论