有名信号量 用于 无血缘的进程间互斥
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;
}
网友评论