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

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

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

#include<stdio.h>
#include<semaphore.h>
#include<unistd.h>
#include<sys/mman.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[])
{
     //定义一个无名信号量
     //MAP_ANONYMOUS匿名映射 ‐1不需要文件描述符
     sem_t *sem = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED |
     MAP_ANONYMOUS, ‐1, 0); 
    //无名信号量的初始化 第一个1表示进程 第二个1表示初始化值1
    sem_init(sem, 1, 1);
    pid_t pid = fork();
    if (pid == 0) //子进程
    { 
          //P操作
          sem_wait(sem);
          my_printf("hello");
          //V操作
          sem_post(sem); 
    }
    else if (pid > 0) //父进程
    { 
         //P操作
         sem_wait(sem);
         my_printf("world");
         //V操作
         sem_post(sem);
    }    
     sem_destroy(sem);
     return 0;
}


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

#include<stdio.h>
#include<semaphore.h>
#include<unistd.h>
#include<sys/mman.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[])
{
     //定义一个无名信号量
     //MAP_ANONYMOUS匿名映射 ‐1不需要文件描述符
     sem_t *sem1 = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE,
                                             MAP_SHARED |     MAP_ANONYMOUS, ‐1, 0);
     sem_t *sem1 = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE,                                             MAP_SHARED |     MAP_ANONYMOUS, ‐1, 0);

     //无名信号量的初始化 第一个1表示进程 第二个1表示初始化值1
    sem_init(sem1, 1, 1);
    sem_init(sem2, 1, 0);
    pid_t pid = fork(); 
   if (pid == 0) //子进程
    {
           //P操作
          sem_wait(sem1);
          my_printf("hello");
          //V操作
          sem_post(sem2);
     }
    else if (pid > 0) //父进程
    {
          //P操作
         sem_wait(sem2);
         my_printf("world");
         //V操作
         sem_post(sem1);
    }
    sem_destroy(sem); 
    return 0;
}

上一篇 下一篇

猜你喜欢

热点阅读