免费注册 查看新帖 |

Chinaunix

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

[C] C语言中管道和socket的疑问? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-04 18:36 |只看该作者 |倒序浏览

我将代码中的pipe创建函数(红色部分)放置在循环外,程序运行后,报read pipe failed的错误!
如果将pipe创建函数(红色部分)放置在循环内,则程序运行正确,请问高手这是为什么呢?

int main()
{
        struct sockaddr_in s_addr,c_addr;
        char buf[SIZE];
        char buf2[SIZE];
        int num;
        int len;
        int s_fd;
        int fd[2];
        int pid;
        len=sizeof(c_addr);
        s_fd=socket(AF_INET,SOCK_DGRAM,0);
        if(s_fd < 0)
        {
                myerr("create socket error!");
        }
        memset(&s_addr,0,sizeof(s_addr));
        s_addr.sin_family=AF_INET;
        s_addr.sin_port=htons(5051);
        s_addr.sin_addr.s_addr=INADDR_ANY;
        if(bind(s_fd,(struct sockaddr *)&s_addr,sizeof(s_addr))<0)
        {
                myerr("bind error!");
        }
        while(1)
        {
                if(pipe(fd)<0)
                {
                        myerr("pipe failed!");
                }

                num=recvfrom(s_fd,buf,SIZE,0,(struct sockaddr *)&c_addr,&len);
                if(num < 0)
                {
                        myerr("recv message error!");
                }       
                printf("client message:  %s\n",buf);
                if((pid=fork())<0)
                {
                        myerr("fork failed!");
                }
                else if(pid==0)
                {
                        close(fd[0]);
                        dup2(fd[1],STDOUT_FILENO);
                        close(fd[1]);
                        execl("/bin/ps","ps","aux",(char *)0);
                        exit(0);
                }
                else
                {
                waitpid(pid);
                close(fd[1]);
                num=read(fd[0],buf2,SIZE);
                close(fd[0]);
                printf("%s \n",buf2);
                if(num < 0)
                {
                        myerr("read pipe failed!");
                }
}
}

我将代码中的pipe创建函数(红色部分)放置在循环外,程序运行后,报read pipe failed的错误!
如果将pipe创建函数(红色部分)放置在循环内,则程序运行正确,请问高手这是为什么呢?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2012-12-04 20:55 |只看该作者
num=read(fd[0],buf2,SIZE);
                close(fd[0]);

放循环外, 你都close了下次怎么用?

很明显一个子进程一对pipe, 你不放循环里能行吗.

论坛徽章:
0
3 [报告]
发表于 2012-12-06 10:33 |只看该作者
谢谢2楼,茅舍顿开!哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP