免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1861 | 回复: 6
打印 上一主题 下一主题

unix环境高级编程父子进程交替问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-31 10:05 |只看该作者 |倒序浏览
目前学习到Unix信号,课后习题10.6主要利用书中的TELLWAIT,TELLPARENT,TELLCHILD,WAITPARENT,WAITCHILD处理父子进程交替输出。自己写了一段程序输出如下:
parent write 0
child write 0
parent write 1
然后程序一直阻塞。。。不知道什么问题,哪位高手帮助解决并解释一下。
程序如下:
static volatile sig_atomic_t sigflag = 0; /* set nonzero by sig handler */
static sigset_t newmask, oldmask, zeromask;

static void
sig_usr(int signo)   /* one signal handler for SIGUSR1 and SIGUSR2 */
{
    sigflag = 1;
}

void
TELL_WAIT(void)
{
    if (signal(SIGUSR1, sig_usr) == SIG_ERR)
        err_sys("signal(SIGUSR1) error");
    if (signal(SIGUSR2, sig_usr) == SIG_ERR)
        err_sys("signal(SIGUSR2) error");
    sigemptyset(&zeromask);
    sigemptyset(&newmask);
    sigaddset(&newmask, SIGUSR1);
    sigaddset(&newmask, SIGUSR2);

    /*
     * Block SIGUSR1 and SIGUSR2, and save current signal mask.
     */
    if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
        err_sys("SIG_BLOCK error");
}

void
TELL_PARENT(pid_t pid)
{
    kill(pid, SIGUSR2);              /* tell parent we're done */
}

void
WAIT_PARENT(void)
{
    while (sigflag == 0)
       { sigsuspend(&zeromask);}  /* and wait for parent */
    sigflag = 0;

    /*
     * Reset signal mask to original value.
     */
    if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
        err_sys("SIG_SETMASK error");
}

void
TELL_CHILD(pid_t pid)
{
    kill(pid, SIGUSR1);             /* tell child we're done */
}

void
WAIT_CHILD(void)
{
    while (sigflag == 0)
        {sigsuspend(&zeromask);} /* and wait for child */
    sigflag = 0;

    /*
     * Reset signal mask to original value.
     */
    if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
        err_sys("SIG_SETMASK error");
}
char byte[1] = {'0'};
int main()
{
        pid_t pid,parent_pid,child_pid;

        int fd;
               
        parent_pid = getpid();
       
        TELL_WAIT();
        if((pid = fork()) < 0)
        {
                printf("fork error!\n");
               
        }
        else if(pid == 0)
        {
                while(1)
                {
                        WAIT_PARENT();
                        printf("child write %c\n",byte[0]);
                        byte[0]++;
                        sleep(1);
                        TELL_PARENT(parent_pid);
                }
        }
        else
        {
                while(1)
                {
                        printf("parent write %c\n",byte[0]);
                        byte[0]++;
                        sleep(1);
                        TELL_CHILD(pid);
                        WAIT_CHILD();                       
                }
        }
       
        exit(0);
}

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2012-03-31 13:16 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2012-03-31 16:04 |只看该作者
回复 2# MMMIX
十分感谢!把signal改为sigaction后解决?不知道为什么.
顺便问一下,信号处理函数和主进程是同时运行么?另外信号处理函数可以阻塞么?谢谢!
   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2012-03-31 16:06 |只看该作者
sonlic 发表于 2012-03-31 16:04
顺便问一下,信号处理函数和主进程是同时运行么?

不是。

另外信号处理函数可以阻塞么?谢谢!


还是不要的好。

论坛徽章:
0
5 [报告]
发表于 2012-04-05 22:21 |只看该作者
回复 4# MMMIX
不好意思,我可能没问明白,信号是一种软中断,那么中断就有上下半部。那么信号处理程序是下半部么?可以中断么?它会随着时间片的耗尽,暂时的等待么?还是信号产生之后先运行中断处理程序,在运行主进程?刚刚学习,不好意思。谢谢。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2012-04-06 09:30 |只看该作者
回复 5# sonlic


    看来你是把用户空间的中断处理函数和内核的中断处理函数混淆了。

论坛徽章:
0
7 [报告]
发表于 2012-04-06 11:02 |只看该作者
回复 6# MMMIX

多谢!一语惊醒梦中人!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP