【问题标题】:Linux C - child process thinks the pipe is emptyLinux C - 子进程认为管道是空的
【发布时间】:2017-04-02 04:18:06
【问题描述】:

我对这个家庭作业有疑问。我正在学习 Linux C,所以我是初学者。

现在练习很简单:我必须创建一个子进程。现在父进程需要读取一个文本文件(例如 a.txt)并通过管道发送。子进程从管道读取并将管道的内容打印到终端。但是我不明白子进程不读取管道是因为它认为管道是空的。

我发布了到目前为止我所做的代码:

#include "myinclude.h" //a separate file which contains all needed headers to run the program.

#define MERET 80

int main(int argc,char *argv[]){

    int pfd[2];
    int status;
    char buffer[MERET];
    pid_t pid;
    FILE *fp1,*fp2;
    if(argc != 2){
        printf("Nincs eleg argumentum");
    }
    if(pipe(pfd) < 0){
        syserr("pipe");
    }
    if((pid = fork()) < 0){
        syserr("fork");
    }
    if(pid == 0){
        close(pfd[1]);
        if ((fp1 = fdopen (pfd[0],"r")) <0){
                    syserr("fdopen");
            }
        printf("mukodsz");
        while(fgets(buffer,MERET,fp1) != NULL){//something here is not good 
            printf("%s",buffer);
            fprintf(stdout,"Siker");
        }
        close(pfd[0]);
        exit(0);
    }
    close(pfd[0]);
    if ((fp1 = fdopen (pfd[1],"w")) == NULL){
        syserr("fdopen");
    }
    if((fp2 = fopen(argv[1],"r")) < 0){
        syserr("fopen");
    }
    while(fgets(buffer,MERET,fp2) != NULL){
        fprintf(fp1,"%s",buffer);
        //fprintf(stdout,"Siker\n");
    }
    close(pfd[1]);
    wait(&status);
    //fprintf(stdout,"Siker");
    exit(0);
}

在我的语言中,“siker”意味着成功。我用它来调试程序,但是子进程的while循环没有打印任何东西。

【问题讨论】:

    标签: c linux fork


    【解决方案1】:

    当你fdopen。你必须fclose

    如果您改为close 原始文件描述符,则与FILE* 关联的缓冲区中的所有尚未写入的数据都会丢失。

    【讨论】:

    • 你是对的!感谢解决问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2020-12-07
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多