当前位置:  技术问答>linux和unix

Linux中管道的使用(父或子进程中能否都保留读写端)

    来源: 互联网  发布时间:2017-01-12

    本文导语:  最近在看管道相关的操作,管道可用于父子进程间的IPC。 通常情况下,数据流是单向的(半双工),如对于父->子的管道,在父进中要关闭读端(fd[0]),子进程中关闭写端(fd[1])。对于子->父的管道,在父进中要关...

最近在看管道相关的操作,管道可用于父子进程间的IPC。
通常情况下,数据流是单向的(半双工),如对于父->子的管道,在父进中要关闭读端(fd[0]),子进程中关闭写端(fd[1])。对于子->父的管道,在父进中要关闭写端(fd[1]),子进程中关闭读端(fd[0])。

我的问题是,能否在父子进程中对于读写端都不关闭,从而可以实现父子的全双工通讯。

我写了简单的测试代码,输出为:
C
P
kkkkkkkkkkkk

用sleep进行延时,让子进程先执行,由输出看确实先输出了"C",但为何这时,在父进程中的write(fd[1], "tttttt", 6);无效呢?

code:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
int fd[2];
pid_t pid;
char get[13];
if(pipe(fd) < -1){
printf("Pipe Error!\n");
return -1;
}
if((pid = fork()) < 0){
printf("Fork Error!\n");
return -1;
}else if(pid > 0){
/* parent */
sleep(1);
printf("P\n");
write(fd[1], "tttttt", 6);
read(fd[0], get, 12);
get[12] = '\0';
printf("read: %s\n", get);
}else{
/* child */
printf("C\n");
write(fd[1], "kkkkkkkkkkkk", 12);
}

}




|
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>

void alrmFunc(int signo)
{
        printf("alarm\n");
        exit(2);
}

void chldFunc(int signo)
{
        pid_t pid;

        while(true)
        {
                pid=waitpid(-1,NULL,WNOHANG);

                if(pid==0)
                {
                        break;
                }
                else if(pid<0)
                {
                        if(errno==ECHILD)
                        {
                                break;
                        }
                }
                else
                {
                        printf("pid:%d exit!\n",pid);
                }
        }
}

int main(int argc, char **argv)
{
    int fd[2];
    pid_t pid;
    char get[13];

        if(signal(SIGCHLD,chldFunc)==SIG_ERR)
        {
                perror("signal");
                exit(1);
        }

    if(pipe(fd) < -1){
        printf("Pipe Error!\n");
        return -1;
    }
    if((pid = fork()) < 0){
        printf("Fork Error!\n");
        return -1;
    }else    if(pid > 0){
        /* parent */
                if(signal(SIGALRM,alrmFunc)==SIG_ERR)
                {
                        perror("signal");
                        exit(1);
                }

        printf("P\n");
        write(fd[1], "tttttt", 6);
                int n;

                alarm(3);

        while( (n=read(fd[0], get, 12))>0 )
                {
                        get[n]='\0';
                        printf("%s",get);
                        fflush(stdout);
                }
                //父进程读光父子进程所有数据
                //但是父进程阻塞在read,没法close pipe[1]
                //所以read也得不到EOF,这就是很纠结的一件事了
                //设置read非阻塞说不定运气不好数据没读全就EAGAIN了
                //可以使用select pipe[0],设置一个超时值,超时则关闭pipe[1]退出
                //这里我在alarm里退出父进程
                printf("parent exit\n");
                //让父进程退出自动关闭pipe[0] and pipe[1]
    }else{
        /* child */
        printf("C\n");
        write(fd[1], "kkkkkkkkkkkk", 12);
    }

        //子进程退出自动关闭pipe[1],pipe[0].
    //但子进程不是唯一的pipe[1]持有者,所有不发送EOF
        return 0;
}

|
子进程完了后,应该通知父进程吧?是不是应该加以个通知?

|

这样是不行的,当父进程和子进程都从一个pipe中读操作,读出来的可能是自己刚刚写进去的。
如果你想全双工的话,使用两个pipe就好了。

    
 
 

您可能感兴趣的文章:

  • unix/Linux下c++ boost thread库读写锁介绍
  • linux 下能否读写.dbf 或者.xls格式的文件,怎样读写?高手指点,拜谢!!!
  • unix/Linux下c/c++ pthread库读写锁函数介绍
  • 串口读写,双方同时读写控制问题(linux内核)。
  • linux多线程无法进行阻塞方式的读写操作
  • linux下读写硬件
  • 有谁知道,Linux下文件的读写原理是怎样的?急
  • 一台linux机子上的程序要读写另外一台linux机子上的文件,该怎么做呢?
  • 如何在内核模块中对linux字符驱动进行读写呢
  • linux环境下SD卡如何读写
  • linux下面configlib库的读写问题
  • 哪位大侠知道Linux里的有名管道传送数据快不快?有名管道操作的过程是否有读写硬盘的操作?
  • 在linux下有没有想windows下vc一样读写ini 配置文件的库或函数
  • 怎么使用 linux 下的 libxml2 库读写 xml 文件和设置属性
  • 有关linux下读写串口的问题,在线等待!
  • 怎样将linux系统底下一个文件夹的只读属性改为可读写的属性?
  • 急求 linux下串口同时进行读写问题解决方法
  • Linux 中对文件的读写的问题
  • Linux内核中文件进行读写操作的问题
  • linux下是通过什么方式读写硬盘的?
  • 在linux中,如何读写usb端口数据
  • linux管道问题,管道建立后如何同步?
  • Linux下面的"匿名管道",是否对应着某种实体?
  • linux进程管道通信
  • linux 管道通信
  • linux shell如何非阻塞写命名管道
  • 关于linux下管道的概念性问题
  • linux管道应用场景
  • 关于linux下管道的一个问题
  • windows下编程中有没有linux编程中管道和信号的概念?
  • 管道符号|命令在uninx和linux下边有什么区别吗?
  •  
    本站(WWW.169IT.COM)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.169IT.COM)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux僵尸(zombie)进程介绍及清除
  • 高手请教!linux怎样通过pid获取进程信息,如:进程名、进程状态等?
  • linux下进程占用内存空间详解
  • linux命令如何实现重启父进程而不会使其子进程退出
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • Linux中最多同时可以开多少个进程,一个进程可以开多少个线程?
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • Linux守护进程 的子进程 终端处理
  • Linux内核进程与应用进程的通信方式有哪些?
  • 在linux,如何用共享内存来实现进程间的通讯?(这些进程没有父子关系)
  • linux下system函数调用shell命令后,怎样让主进程不等子进程返回,接着执行(在线)?
  • linux进程(线程)运行过程中如何获取本进程当前的内存使用状况,统计信息?
  • 如何linux下监控进程及其子进程占用资源?
  • linux下的进程如何访问另外一个进程建立的mutex?
  • linux中用killall命令杀死进程的时候会释放掉该进程所占有的内存吗?
  • linux内核高手进!关于调用__fork()时0号进程的子进程才能与父进程共享PID的困惑
  • 请教:在Linux下怎么样检测一个进程是否是僵尸进程??
  • 请问linux进程的哪些信息保存在内核里?哪些信息又保存在进程空间里?谢谢
  • Linux下请教一个父进程杀死子进程的问题.
  • 怎么查看Linux中所运行的进程,并且知道哪些是停止响应的,用什么命令可以杀掉停止响应的进程?
  • 【求助】linux/Unix下创建子进程,向父进程发送信号,子进程也能收到改信号,此时如何让子进程不收到信号
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2017,169IT.COM,E-mail:www_169it_com#163.com(请将#改为@)

    浙ICP备11055608号