在我的课程中,
这两个功能是:
void printFile(char *fileName)
{
char *fileContent=(char *)malloc(200*sizeof(char)); /* sufficiently large buffer */
if((filePtr=fopen(fileName,"r"))==NULL)
{
printf("Error opening %s: %s\n",fileName,strerror(errno));
if( (strcmp(fileName,"/tmp/command.log")==0) || (strcmp(fileName,"/tmp/output.log")==0) ){exitStatus=255;}
}
else
{
while(fscanf(filePtr,"%s",fileContent)!=EOF)
{
printf("%s",fileContent);
printf("%c",fgetc(filePtr));
}
fclose(filePtr);
}
}
void outCopy(char *fileName)
{
char *fileContent=(char *)malloc(200*sizeof(char)); /* sufficiently large buffer */
if( (filePtr=fopen(fileName,"r"))==NULL || (filePtr2=fopen("/tmp/output.log","a"))==NULL )
{
printf("Error opening files: %s\n",strerror(errno));
}
else
{
while(fscanf(filePtr,"%s",fileContent)!=EOF)
{
fprintf(filePtr2,"%s",fileContent);
fprintf(filePtr2,"%c",fgetc(filePtr));
}
fclose(filePtr);
fclose(filePtr2);
}
}
然而,我整洁的小方案因ls
命令的输出而受到干扰:
预期产出:
a.c c.c e.c
b.c d.c
当前输出:
a.c
b.c
c.c
d.c
e.c
如何更改其中一项或两项功能以获得正确的输出?
(请不要建议使用管道或T恤,否则我将不得不更改我的exec()呼叫孩子的主要部分)
修改:请注意outCopy()
& printFile()
由父级运行。 孩子已将输出dup2()
添加到所需的临时文件中。
答案 0 :(得分:2)
某些版本的ls
(包括Linux中使用的GNU版本)会检测它们是以终端还是使用管道作为标准输出运行,并更改其格式。如果你想要完全相同的输出,你需要使用posix_openpt调用和朋友创建一个伪TTY(pty)。或者您可以使用script
实用程序,它会为您处理此问题。
另一种选择是使用-C
ls
选项来强制列式布局;但是,这可能不完全相同,因为ls
不知道终端的宽度,并且可能假设宽度错误。此外,其他功能(如彩色输出)可能会丢失。
答案 1 :(得分:2)
当stdout不是tty时,ls
会将用户友好列中的行为更改为脚本友好列表。无论附加设备stdout的类型如何,标志ls -C
都会强制进行柱状输出。