在管道之后搞砸了打印顺序

时间:2013-06-08 00:19:52

标签: c pipe

childc.exe计划是这样的:

#include<stdio.h>
#include<windows.h>
int main()
{
    printf("this is apple pie\n");
    return 0;
}

主程序调用{​​{1}}然后调用fork()来处理execl()。代码如下:

childc.exe

我希望得到这个输出:

#include <stdio.h>
#include<windows.h>
#include<unistd.h>
int main()
{
    int fd[2];
    if(pipe(fd)==-1)
    {
        printf("pipe failed\n");
        exit(1);
    }
    pid_t pid=fork();
    if(!pid)
    {
        dup2(fd[1],1);
        close(fd[0]);
        execl("childc.exe","childc.exe",NULL);
    }
    dup2(fd[0],0);
    close(fd[1]);
    char line[100];
    scanf("%[^\n]",line);
    printf("the line is:%sand this is the end\n",line);
    return 0;
}

但实际输出是:

the line is: this is apple pie
and this is the end

请帮忙。

2 个答案:

答案 0 :(得分:2)

看起来像unix代码,.exe<windows.h>除外。在cygwin中运行吗?

问题似乎是子进程使用Windows样式的CRLF行终止符打印其输出,并且父进程的scanf正在读取LF而不包括它,因为您说{{1} }。

这会给你一个包含%[^\n]后跟\r的字符串,所以当你打印它时,光标会回到行的开头,输出的下一部分会覆盖第一行。一部分。

即使在没有\n的真正的unix上运行使事情变得复杂,你也不会得到你想要的输出,因为你不允许\r被包含在{{1}中'ed string,你没有在输出该字符串的\n之后添加一个。

答案 1 :(得分:1)

我尝试使用getline而不是scanf来避免任何平台特定问题,例如Wumpus Q.Wumbley提到的有关Windows CRLF换行符与Unix / Linux LF换行符的问题:

char *line = NULL;
getline(&line, NULL, stdin)
printf("the line is:%sand this is the end\n",line);