</pre><pre name="code" class="cpp">#include <iostream>
#include <signal.h>
#include <wait.h>
#include <errno.h>
using namespace std;
static volatile sig_atomic_t sigflag;
static sigset_t newmask,oldmask,zeromask;
//信号处理程序
static void sig_usr(int signo)
{
sigflag=1;
}
//注册信号处理程序,并阻塞用户信号SIGUSR1和SIGUSR2
void TELL_WAIT(void)
{
if(signal(SIGUSR1,sig_usr)==SIG_ERR)
{
cout<<"signal(SIGUSR1) error"<<endl;
}
if(signal(SIGUSR2,sig_usr)==SIG_ERR)
{
cout<<"signal(SIGUSR2) error"<<endl;
}
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask,SIGUSR1);
sigaddset(&newmask,SIGUSR2);
if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0)
{
cout<<"SIG_BLOCK error"<<endl;
}
}
//子进程在延缓信号函数处阻塞,但进程并不阻塞任何信号,
//等待父进程发信号和信号处理函数返回后,复原阻塞信号状态,并进程继续运行
void WAIT_PARENT(void)
{
while(sigflag==0)
{
if(sigsuspend(&zeromask)<0)
{
if(errno!=EINTR)
cout<<"sigsuspend error"<<endl;
}
}
sigflag=0;
if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0)
{
cout<<"SIG_SETMASK error"<<endl;
}
}
//给父进程发信号
void TELL_PARENT(pid_t pid)
{
kill(pid,SIGUSR1);
}
//父进程在延缓信号函数处阻塞,但进程并不阻塞任何信号,
//等待子进程发信号和信号处理函数返回后,复原阻塞信号状态,并进程继续运行
void WAIT_CHILD(void)
{
while(sigflag==0)
{
if(sigsuspend(&zeromask)<0)
{
if(errno!=EINTR)
cout<<"sigsuspend error"<<endl;
}
}
sigflag=0;
if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0)
{
cout<<"SIG_SETMASK error"<<endl;
}
}
//给子进程发送信号
void TELL_CHILD(pid_t pid)
{
kill(pid,SIGUSR2);
}
int main()
{
pid_t pid;
TELL_WAIT();
//以下两行代码不能写入循环,因为这是初始设定,不阻塞父进程,阻塞子进程
sigflag=1;
WAIT_CHILD();
if((pid=fork())<0)
{
cout<<"fork error"<<endl;
}else if(pid==0)
{
for(int i=0;i<10;++i)
{
WAIT_PARENT();
cout<<"c:"<<i<<endl;
TELL_PARENT(getppid());
}
}else
{
cout<<"p:"<<0<<endl;
TELL_CHILD(pid);
for(int i=1;i<10;++i)
{
WAIT_CHILD();
cout<<"p:"<<i<<endl;
TELL_CHILD(pid);
}
int stat;
wait(&stat);
}
return 0;
}
进程同步示例代码(依据信号量达到同步)
最新推荐文章于 2023-06-09 02:27:09 发布