免费注册 查看新帖 |

Chinaunix

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

[Linux] linux编程 mkfifo函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-06 22:02 |只看该作者 |倒序浏览
不好意思,虽然不是初学者。但水平一直很菜。
在看fifo函数的时候,编写了个小程序,但总达不到我想要的结果。又找不到问题所在。
只有在此求教各位,望不吝赐教。非常感谢。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <wait.h>

#define ERR_EXIT(m)\
        do{\
            perror(m);\
            exit(-1);\
        }while(0)\

int main(int argc, char* argv[])
{
    int fd,status;
    pid_t pid;
    char buf[10];

    unlink("/tmp/fifo");
    mkfifo("/tmp/fifo",0666);

    pid=fork();

    if(pid<0)
        ERR_EXIT("fork error");

    if(pid>0)
    {
        wait(&status);
        sleep(5);
        fd=open("/tmp/fifo",O_RDWR);
        read(fd,buf,10);
        close(fd);
        printf("the buf is :%s\n",buf);
    }
    else
    {
        fd=open("/tmp/fifo",O_RDWR);
        write(fd,"ABCDEFG",7);
        close(fd);
        exit(0);
    }

    return 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-09-07 09:21 |只看该作者
回复 1# hstking


    你想要什么结果?

论坛徽章:
0
3 [报告]
发表于 2012-09-07 13:45 |只看该作者
我希望的是父进程先创造一个命名管道。然后用fork建立一个子进程。由子进程向命名管道内写入数据。父进程等待子进程返回后读入数据。

论坛徽章:
23
双鱼座
日期:2013-08-30 09:25:19辰龙
日期:2014-07-28 11:22:24白羊座
日期:2014-08-26 10:34:1815-16赛季CBA联赛之浙江
日期:2016-03-15 10:51:5415-16赛季CBA联赛之八一
日期:2016-05-31 09:38:3615-16赛季CBA联赛之辽宁
日期:2017-08-31 14:59:2115-16赛季CBA联赛之辽宁
日期:2017-12-06 14:12:3615-16赛季CBA联赛之天津
日期:2019-01-02 15:25:4915-16赛季CBA联赛之深圳
日期:2020-12-06 11:26:21狮子座
日期:2014-05-19 09:16:35技术图书徽章
日期:2014-03-27 13:37:39技术图书徽章
日期:2013-08-30 09:28:52
4 [报告]
发表于 2012-09-07 14:18 |只看该作者
父进程等待子进程返回后读入数据。 这个好像不能做到吧,具体
可了解下fifo的读取规则。

下面这个是可行的应该:
  1.     if(pid<0)
  2.         ERR_EXIT("fork error");
  3.     else if (pid > 0) {
  4.         // parent
  5.         fd=open("/tmp/fifo",O_RDONLY);
  6.         read(fd,buf,10);
  7.         close(fd);
  8.         printf("the buf is :%s\n",buf);
  9.         wait(&status);
  10.     } else {
  11.         // child
  12.         fd=open("/tmp/fifo",O_WRONLY);
  13.         write(fd,"ABCDEFG",7);
  14.         close(fd);
  15.     }
复制代码

论坛徽章:
0
5 [报告]
发表于 2012-09-07 14:40 |只看该作者
感谢各位。我找到原因了。
只要把父进程中的wait函数放到open之后就没问题了。

执行不成功的原因是由于子进程中的管道没有关闭,将父进程的open阻塞了。

非常感谢各位。

论坛徽章:
0
6 [报告]
发表于 2012-09-12 18:14 |只看该作者


从FIFO中读取数据
约定:如果一个进程为了从FIFO中读取数据而阻塞打开了FIFO,那么称该进程内的读操作为设置了阻塞标志的读操作。

•如果有进程写打开FIFO,且当前FIFO为空,则对于设置了阻塞标志的读操作来说,将一直阻塞下去,直到有数据可以读时才继续执行;对于没有设置阻塞标志的读操作来说,则返回0个字节,当前errno值为EAGAIN,提醒以后再试。
•对于设置了阻塞标志的读操作来说,造成阻塞的原因有两种:一、当前FIFO内有数据,但有其它进程在读这些数据;二、FIFO本身为空。
解阻塞的原因是:FIFO中有新的数据写入,不论写入数据量的大小,也不论读操作请求多少数据量,只要有数据写入即可。
•读打开的阻塞标志只对本进程第一个读操作施加作用,如果本进程中有多个读操作序列,则在第一个读操作被唤醒并完成读操作后,其它将要执行的读操作将不再阻塞,即使在执行读操作时,FIFO中没有数据也一样(此时,读操作返回0)。
•如果没有进程写打开FIFO,则设置了阻塞标志的读操作会阻塞。
•如果FIFO中有数据,则设置了阻塞标志的读操作不会因为FIFO中的字节数少于请求的字节数而阻塞,此时,读操作会返回FIFO中现有的数据量。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP