Linux--信号量有血缘进程间同步互斥
无名信号量 用于 血缘关系的进程间互斥
#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;
}