|
发表于 2004-12-14 23:09:29
|
显示全部楼层
要实现你所说的功能,先要屏蔽子进程的键盘中断。如下
sigset_t* set = new sigset_t;
sigprocmask(0,0,set);//get the old signal mask work
sigaddset(set,SIGINT);//add the SIGINT mask
sigprocmask(0,set,0);//reset the subprocess signal mask
然后父进程等待键盘中断产生,然后给子进程发信号就行了。
父子进程间的等待可以如下实现(见《Unix环境高级编程》)
你如果实现过一个shell就知道这其实很简单。
#include <csignal>
#include <cstdio>
#include <sys/types.h>
#include <unistd.h>
#include "synchro.h"
void TELL_WAIT(void);
void TELL_PARENT(pid_t pid);
void WAIT_PARENT(void);
void TELL_CHILD(pid_t pid);
void WAIT_CHILD(void);
bool isSynchroAble(void);
static volatile sig_atomic_t sigflag;
static bool synchronismFlag = true;
static sigset_t newmask, oldmask, zeromask;
static void sig_usr(int signo);
static void sig_usr(int signo)
{
sigflag = 1;
return;
}
void TELL_WAIT(void)
{
if(signal(SIGUSR1, sig_usr) == SIG_ERR)
synchronismFlag = false;
if(signal(SIGUSR2, sig_usr) == SIG_ERR)
synchronismFlag = false;
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGUSR1);
sigaddset(&newmask, SIGUSR2);
if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
synchronismFlag = false;
}
void TELL_PARENT(pid_t pid)
{
kill(pid, SIGUSR2);
}
void WAIT_PARENT(void)
{
while(sigflag == 0)
sigsuspend(&zeromask);
sigflag = 0;
if(sigprocmask(SIG_SETMASK, &oldmask, 0) < 0)
synchronismFlag = false;
}
void TELL_CHILD(pid_t pid)
{
kill(pid, SIGUSR1);
}
void WAIT_CHILD(void)
{
while(sigflag == 0)
sigsuspend(&zeromask);
sigflag = 0;
if(sigprocmask(SIG_SETMASK, &oldmask, 0) < 0)
synchronismFlag = false;
}
bool isSynchroAble(void)
{
return synchronismFlag;
}
(你真是女孩吗?^_^) |
|