• 进程匿名APUE学习进程间通信(1)


    题记:写这篇博客要主是加深自己对进程匿名的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢。

            进程是OS分配内存资源的最小单位,故即使是父子进程也不能向线程那样直接应用全局变量停止通信。进程间的通信需要采用必定的办法,之前我们应用信号实现了进程间的通信,我们再介绍一系列的通信方式,包括:管道(命名 匿名)、消息队列(SV Posix)、共享内存(SV Posix)、信号量(SV Posix)。

            管道首先分为匿名管道和命令管道。先来说明匿名管道,从字面上可以看出来,这类管道没有名字。应用没有名字的管道间停止通信的含意是得到了该管道的操作句柄就可以而不必晓得名字,两个(或以上)进程只应用句柄就意味着,这两个进程不能通过文件名来打开管道取得句柄,只能通过继承来取得,也就是说匿名管道只用用在父子进程间或者有亲属关系的进程停止通信。

        取得匿名管道句柄(文件描述符)的函数是pipe():

    int pipe(int fd[2]);

        pipe()函数将创建并打开一个匿名管道,通过参数fd返回两个该管道的句柄,分离用于对管道停止读写。fd[0]用于读操作,fd[1]用于写操作。

        在调用fork()前,调用pipe()取得匿名管道,那么fork()后这两个描述符父子进程都有,一个进程调用write(fd[0]);另一个进程调用read(fd[1])就可以实现这个进程间的通信了。进程和匿名

        应用匿名管道需要注意一下几点:

        1.从一个写端已关闭的管道中读数据,将所有的数据读完之后,read(fd[0])将返回0;若写端未关闭管道中无可读数据,read(fd[0])调用将阻塞。

        2.向一个读端已关闭的管道中写数据(此时写进去已无意思),write(fd[1])调用将返回-1同时设置errno=EPIPE,且内核会向进程发送SIGPIPE信号。

        3.如果多个进程向管道中写数据,如果其中某个进程写入的字节数大于等于PIPE_BUF时,管道数据将穿插到一同。

        每日一道理
    “一年之计在于春”,十几岁的年纪,正是人生的春天,别辜负了岁月老人的厚爱与恩赐。行动起来,播种梦想吧!

        4.如果多个进程从管道中读数据,读出数据可能并非想要的。解决的办法是:一个管道只用在两个进程间通信,并且坚持老是只有一个读端和一个写端,具体操作是在fork()之后读进程将写端关闭,写进程将读端关闭。

        5.可以利用dup2()重定向标准输入和标准输出到管道。

        popen()函数应用了匿名管道

    FILE *popen(const char *cmdstring, const char *type);
    int pclose(FILE *fp);

        popen()函数执行fork,然后调用exec以执行cmdstring,并返回一个标准I/O文件指针,返回的指针根据type的值确定操作是读("r")还是写("w")。

        注意:凡应用到管道对标准输出重定向的地方,输出后必定要有fflush(stdout)

        命名管道FIFO,fifo和pipe相似,有读写端的观点,区别是命名管道通过名字打开再返回访问句柄(文件描述符),也就是说可以在没有关系的进程间停止通信。打开命名管道的函数是:

    int mkfifo(const char *filename, mod_t mode);

        通过mkfifo()函数将创建一个存在在文件系统中的管道文件,filename指定文件名,而mode指定创建的权限(与open()的mode一样)。删除管道文件应用unlink()即可。

        打开管道文件的函数是open(),关闭函数应用close(),读写仍然是read()/write(),也就是说管道创建后,我们就可以向操作一般文件那样操作管道文件了。但管道文件又有别于一般文件:从一般文件中读出的数据仍然会保留在文件中,从管道文件中读出的数据将会从文件中消失;一般文件可以在任何一个位置上停止读写操作,而管道文件的读写操作必须遵循fifo的特性。

        应用open()函数打开管道时,只有在读写都被打开时才会胜利,否则open()将阻塞,当然如果打开方式已经是读写了就必定能胜利。

        命名管道的一端关闭的情况和匿名管道是一样的。

        

        

        

        

        

        

    文章结束给大家分享下程序员的一些笑话语录: 这个世界上只有10种人:懂得二进制的和不懂得二进制的。

    --------------------------------- 原创文章 By
    进程和匿名
    ---------------------------------

  • 相关阅读:
    effective c++ 条款10 让operator= 返回*this的引用
    基于vs2008的opengl开发环境的配置
    effective c++ 条款13 以对象管理资源
    effective C++ 条款06如果你不想让编译器为你生成函数就应该明确拒绝
    effective c++条款07为多态基类声明为virtual析构函数
    effective c++条款08别让异常逃离析构函数
    effective c++条款11 在operator=中处理“自我赋值”
    ubuntu 下的截图工具
    effective c++ 条款12 赋值对象时勿忘其每一个成员
    [linux 安装]修改centos的yum源
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3108991.html
Copyright © 2020-2023  润新知