Во время моей программы,
- Я передаю вывод execv () в файл для ведения журнала (используя функцию outCopy ())
- , а затем распечатайте его обратно на экран для имитации вывода стандартного вывода. (используя функцию printFile ())
2 функции:
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
Как я могу изменить одну или обе мои функции, чтобы получить правильный вывод?
(Пожалуйста, не предлагайте использовать каналы или тройники, иначе мне придется изменить основную часть моего exec (), вызывающего child)
Редактировать: Обратите внимание, что оба outCopy()
и printFile()
управляются родительским . child .
выводит
dup2()
в нужный временный файл.