频限信号量试验1,连续信号量同步编制程序

2020-01-05 作者:yzc216亚洲城   |   浏览(155)

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

信号量同步

1.  进程1创建信号量集

一。核心概念

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

  进程同步核心概念:一组并发进程进行互相合作,互相等待,使得各进程按一定的顺序执行的过程

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

  称为进程间的同步。

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

二。生产力消费问题

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

  (1)问题描述      

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

  (2)问题程序化         

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

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <sys/ipc.h>
    #include <sys/sem.h>

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

    void main()
    {
      int fd;
      int semid;
      struct sembuf sops;
      key_t key;
      key = ftok("/home",2);
      /*创建信号量*/
      semid = semget(key,1,IPC_CREAT);
      semctl(semid,0,SETVAL,0);
      /*创建产品-文件*/
      fd = open("./product.txt",O_RDWR|O_CREAT,0775);
      /*休息*/
      sleep(20);
      /*向产品文件里面填充内容*/
      write(fd,"the product is finished",25);
      close(fd);
      /*释放信号量*/
      sops.sem_num = 0;
      sops.sem_op = 1;
      sops.sem_flg = SEM_UNDO;
      semop(semid,&sops,1);
      }

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

  /******************************************/      

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

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

运行结果:      

    void main()
    {
      int fd;
      int semid;
      int ret;
      struct sembuf sops;
      key_t key;
      key = ftok("/home",2);
      /*创建信号量*/
      semid = semget(key,1,IPC_CREAT);
      /*获取信号量*/
      sops.sem_num = 0;
      sops.sem_op = -1;
      sops.sem_flg = SEM_UNDO;
      ret = semop(semid,&sops,1);
      printf("val = %dn",ret);
      /*取走产品文件*/
      system("cp ./product.txt ./ship/");
     }

终端1

  (3)加入同步控制      

[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 errnon");

        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  errnon");

        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 okn");

       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 okn");

    }

return 0;

}

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

本文由yzc216亚洲城发布于yzc216亚洲城,转载请注明出处:频限信号量试验1,连续信号量同步编制程序

关键词: yzc216亚洲城