【问题标题】:How can I write twice on the same pipe?我怎样才能在同一个管道上写两次?
【发布时间】:2016-05-13 16:17:05
【问题描述】:

我希望父级从标准输入读取并将其写入管道,然后子级从该管道读取并将其转换为大写并在另一个管道上将其发送回父级,然后父级将其打印在标准输出上,然后写入更多一次。

父母不写时间

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>
#define bufsize 200

int main(int argc,char*argv[])
{
    char buf[bufsize];
    char buf2[bufsize];
    int x;
    int child;
    int fd[2];
    int fd1[2];
    int nbytes,mbytes;
    int i,j,k;
    int status=0;

    if(pipe(fd)==-1)
        printf("pipe");
    if(pipe(fd1)==-1)
        printf("pipe");

    switch(fork())
    {
        case -1 : printf("fork");
        case 0:{
            //for(k=1;k<3;k++)
            //{close(fd[1]);
            nbytes = read(fd[0], buf, bufsize);   

            for(i=0;i<=strlen(buf);i++){
                if(buf[i]>=97&&buf[i]<=122)
                buf[i]=buf[i]-32;
            }//end for

            close(fd1[0]);
            write(fd1[1], buf, nbytes);
            _exit(EXIT_SUCCESS);   

        }//end child

        default:{
            for(j=1;j<3;j++){
                close(fd[0]);
                printf("Enter any thing:\n");
                x=read(STDIN_FILENO, buf, bufsize);
                write(fd[1],buf,x);

                close(fd1[1]);
                mbytes = read(fd1[0], buf, bufsize);   
                close(fd1[0]); 
                write(STDOUT_FILENO, buf, mbytes);
            }
            //wait(status);
            exit(EXIT_SUCCESS);
        }//end default
    }//end switch
}

【问题讨论】:

  • 请不要保存空格键,而是正确缩进你的代码,以便可以阅读你打算在那里做的任何事情。
  • 另请注意,在分叉失败时,您还将运行case 0: 的代码!在case -1: 末尾添加一个中断。
  • 我不明白,你们这些人(不缩进代码)使用什么作为文本编辑器? Windows 记事本?大多数现代代码编辑器只是为你做这件事,你必须努力阻止它们。
  • '意味着你不会出现'
  • fdfd1 是两个文件描述符数组的可怕名称。但是您的问题是您第一次通过 for 循环关闭了文件描述符。所以第二次,您正在读取和写入已关闭的文件描述符,这是未定义的行为。

标签: c linux ubuntu-14.04


【解决方案1】:

如果你想向同一个管道写入两次,不要在第一次写入后关闭它。完成后才关闭它。

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多