無名信號量 用于 血緣關系的進程間互斥
#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;
}