当前位置: 技术问答>linux和unix
父子进程交互输出问题。
来源: 互联网 发布时间:2016-05-20
本文导语: 程序利用从键盘获取一个字符,并打印1111,若按下tab键则创建子进程,循环获取并输出2222,按下tab键重新切回父进程。现在父--->子-->父--->子都可以正常切,但是为什么再从子就切不回来了呢?卡死在wait_chid()里了,不...
程序利用从键盘获取一个字符,并打印1111,若按下tab键则创建子进程,循环获取并输出2222,按下tab键重新切回父进程。现在父--->子-->父--->子都可以正常切,但是为什么再从子就切不回来了呢?卡死在wait_chid()里了,不知道怎么回事。请大家指点。代码如下:
#include
#include
#include
void tell_wait();
void wait_child(void);
void wait_parent(void);
void tell_child(pid_t pid);
void tell_parent(pid_t pid);
void sig_usr(int signo);
static volatile sig_atomic_t sigflag;
static sigset_t newmask, oldmask, zeromask;
main()
{
int ch,i=1,j =0 ,k=2;
int start=0;
int mm = 0;
int exit=0;
WINDOW *wins[2];
pid_t pid;
tell_wait();
while (ch = getchar())
{
exit = 0;
switch(ch)
{
case 'q':
exit = 1;
break;
case 9:
if (0 == start) //第一次切换
{
if ((pid = fork()) == 0) //子进程
{
while(ch = getchar())
{
exit = 0;
switch(ch)
{
case 9:
exit = 1;
break;
default:
break;
}
if (1 == exit)
{
tell_parent(getppid());
wait_parent();
}
}
}
else if(pid >0) //父进程
{
wait_child();
start = 1;
}
}
else
{
tell_child(pid);
wait_child();
}
break;
default:
break;
}
if (1 == exit) break;
}
}
void sig_usr(int signo)
{
if(signo == SIGCONT)
{
sigflag = 1;
}
else
printf("received unexpected signal(%d)n", signo);
return;
}
void tell_wait()
{
if (signal(SIGCONT, sig_usr) == SIG_ERR)
printf("signal(SIGINT) error");
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGCONT);
if (sigprocmask(SIG_BLOCK, &newmask, &oldmask)
#include
#include
#include
void tell_wait();
void wait_child(void);
void wait_parent(void);
void tell_child(pid_t pid);
void tell_parent(pid_t pid);
void sig_usr(int signo);
static volatile sig_atomic_t sigflag;
static sigset_t newmask, oldmask, zeromask;
main()
{
int ch,i=1,j =0 ,k=2;
int start=0;
int mm = 0;
int exit=0;
WINDOW *wins[2];
pid_t pid;
tell_wait();
while (ch = getchar())
{
exit = 0;
switch(ch)
{
case 'q':
exit = 1;
break;
case 9:
if (0 == start) //第一次切换
{
if ((pid = fork()) == 0) //子进程
{
while(ch = getchar())
{
exit = 0;
switch(ch)
{
case 9:
exit = 1;
break;
default:
break;
}
if (1 == exit)
{
tell_parent(getppid());
wait_parent();
}
}
}
else if(pid >0) //父进程
{
wait_child();
start = 1;
}
}
else
{
tell_child(pid);
wait_child();
}
break;
default:
break;
}
if (1 == exit) break;
}
}
void sig_usr(int signo)
{
if(signo == SIGCONT)
{
sigflag = 1;
}
else
printf("received unexpected signal(%d)n", signo);
return;
}
void tell_wait()
{
if (signal(SIGCONT, sig_usr) == SIG_ERR)
printf("signal(SIGINT) error");
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGCONT);
if (sigprocmask(SIG_BLOCK, &newmask, &oldmask)