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
请帮忙。
答案 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);