Linux--信号量无血缘进程间同步互斥

2024-11-17  本文已影响0人  锈色的栅栏

有名信号量 用于 无血缘的进程间互斥

1、创建一个有名信号量

#include <fcntl.h> /* For O_* constants */
#include <sys/stat.h> /* For mode constants */
#include <semaphore.h>
//信号量存在
sem_t* sem_open(const char *name,int oflag);
//信号量不存在
sem_t* sem_open(const char* name,int oflag,mode_t mode, unsigned int value);

功能:
        创建一个信号量
参数:
        name:信号量的名字
        oflag:sem_open函数的权限标志
        mode:文件权限(可读、可写、可执行 0777)的设置
        value:信号量的初始值
返回值:
        信号量的地址,
        失败:SEM_FAILED

2、信号量的关闭:

int sem_close(sem_t* sem);

功能:
        关闭信号量
参数:
        信号量的的地址
返回值:
        成功0
        失败-1

3、信号量文件的删除

#include<semaphore.h>
int sem_unlink(const char* name);

功能:
        删除信号量的文件
参数:
        信号量的文件名
返回值:
        成功0
        失败-1

示例代码

08_taskA.c

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

void my_printf(char* str){
    int i = 0;
    while (str[i] != '\0') 
   {
          printf("%c", str[i++]); 
         fflush(stdout);
          sleep(1); 
     }
   return;
}
int main(int argc,char const* argv[])
{
         //创建一个有名信号量sem_open 最后一个参数为初始值
         sem_t *sem = sem_open("sem", O_RDWR|O_CREAT, 0666, 1);
         sem_wait(sem);
         my_printf("bbbbbbld");
        sem_post(sem); 
        sem_close(sem);
        sem_destroy(sem); 
        return 0;
}

08_taskB.c

#include<stdio.h>
#include<semaphore.h>
#include<unistd.h>
#include<fcntl.h> 
#include<sys/stat.h>
void my_printf(char* str)
{
    int i = 0;
    while (str[i] != '\0')
    {
          printf("%c", str[i++]);
          fflush(stdout);
          sleep(1);
      }
   return;
}
int main(int argc,char const* argv[]){
         //创建一个有名信号量sem_open 最后一个参数为初始值
         sem_t *sem = sem_open("sem", O_RDWR|O_CREAT, 0666, 1); 
         sem_wait(sem);
         my_printf("hsaafdd");
         sem_post(sem);
         sem_close(sem);
         sem_destroy(sem);
         return 0;
}


有名信号量 用于 无血缘的进程间同步

示例代码

09_taskA.c

#include<stdio.h>
#include<semaphore.h>
#include<unistd.h>
#include<fcntl.h> 
#include<sys/stat.h>
void my_printf(char* str){
    int i = 0;
    while (str[i] != '\0')
    {
          printf("%c", str[i++]);
          fflush(stdout);
          sleep(1);
      }
   return;
}
int main(int argc,char const* argv[])
{
         //创建一个有名信号量sem_open 最后一个参数为初始值
         sem_t *sem1 = sem_open("sem1", O_RDWR|O_CREAT, 0666, 1); 
         sem_t *sem2 = sem_open("sem2", O_RDWR|O_CREAT, 0666, 1); 
         

         sem_wait(sem1);
         my_printf("bbbbbbld");
         sem_post(sem2);
         

        sem_close(sem1);
         sem_close(sem2);
         

        sem_destroy(sem1);
         sem_destroy(sem2);
         return 0;
}

09_taskB.c

#include<stdio.h>
#include<semaphore.h>
#include<unistd.h>
#include<fcntl.h> 
#include<sys/stat.h>
void my_printf(char* str)
{
    int i = 0;
    while (str[i] != '\0')
    {
          printf("%c", str[i++]);
          fflush(stdout);
          sleep(1);
      }   
      return;
}
int main(int argc,char const* argv[])
{
         //创建一个有名信号量sem_open 最后一个参数为初始值
         sem_t *sem1 = sem_open("sem1", O_RDWR|O_CREAT, 0666, 1);
         sem_t *sem2 = sem_open("sem2", O_RDWR|O_CREAT, 0666, 1); 

         sem_wait(sem2);
         my_printf("bbbbbbld");
         sem_post(sem1); 
         sem_close(sem1);
         sem_close(sem2);
         sem_destroy(sem1);
         sem_destroy(sem2);
         return 0;
}

上一篇 下一篇

猜你喜欢

热点阅读