介绍
进程同步用的
sem_open 创建/获取
sem_wait 进入
sem_post 出去
sem_close 关闭
sem_unlink 删除信号量
Demo
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <semaphore.h>
#include <signal.h>
#include <sys/wait.h>
#include <queue>
#define SEM_NAME "s1"
void sig_proc(int pid)
{
wait(&pid);
}
int main()
{
pid_t pid = fork();
if(pid == 0)
{
//child
sleep(1);
sem_t* sem = sem_open(SEM_NAME, 0, 0, 1);
for(int i = 0; i < 5; i++)
{
sem_wait(sem);
std::cout << "child: " << getpid() << " enter" << std::endl;
sleep(1);
std::cout << "child: " << getpid() << " leave" << std::endl;
sem_post(sem);
}
sem_close(sem);
return -1;
}
else if(pid < 0)
{
//error
std::cout << "error" << std::endl;
return -1;
}
signal(SIGCHLD, sig_proc);
sem_unlink(SEM_NAME);
sem_t* sem = sem_open(SEM_NAME, O_CREAT, 0664, 1);
if(sem == SEM_FAILED)
{
perror("sem_open err:");
return -1;
}
for(int i = 0; i < 5; i++)
{
sem_wait(sem);
std::cout << "parent: " << getpid() << " enter" << std::endl;
sleep(1);
std::cout << "parent: " << getpid() << " leave" << std::endl;
sem_post(sem);
sleep(1);
}
sleep(10);
sem_close(sem);
sem_unlink(SEM_NAME);
return 0;
}