이 코드는 2 개의 파일을 가져 와서 결과를 세 번째 파일로 저장합니다. 이렇게해도 문제가되지 않지만 마지막 printf는 화면에 인쇄되지 않습니다. 첫 번째는 잘 인쇄됩니다. 이것은 stdout을 올바르게 복원하지 못했음을 나타냅니다.stdout을 다시 얻지 못함
int main (int argc, char *argv[])
{
char *join[4]={"cat", "file1.txt","file2.txt", 0};
int id, fd, status;
printf("fd=%d\n", fd); //this one prints to screen
fd=dup(1); //save stdout
close(1); close stdout
FILE *out=fopen("output.c", "a"); //this is where the output should go
id=fork(); //0 for child
if (id>0) //parent process
{
waitpid(id, &status, WUNTRACED);
}
else if (id==0) //child process
{
execvp(join[0], join);
}
else //error
{
printf("error occured");
}
close(1);
dup2(fd, 1);
fclose(out);
printf("fd=%d\n", fd); //this one doesn't print to screen
return 0;
}
'fd'는 절대로 값이 주어지지 않으므로, 정의되지 않은 값을 fileid에 넣을 것입니다. 닫은 후에는 원래 stdout을 복원하려고하지 않으므로 왜 마술처럼 작동 할 것이라고 기대합니까? – John3136
골격 코드에 중요한 단계가 많이 빠져 있습니다. MCVE ([MCVE])가 아니지만, 우리가 할 일은 당신이 무엇을하고 있는지를 확인하고 공백을 채울 수 있습니다. 우리가 수행하지 않은 것에 대해 추측하고 찡그린다면 (예를 들어'fd'를 초기화하거나 의미가 무엇인지 궁금해 할 때) 가장 좋은 방법입니다. –
죄송합니다. 아직 새로운 소식입니다. 나는 약간의 편집을했고 여전히 두 번째 print 문을 보지 못했고 이제 터미널에 무엇을 입력하는지 볼 수 없습니다. 나는'dup2 (fd, 1)'로 출력을 복원했다고 생각 했는가? –