2012-03-30 3 views
6

나는 두 명의 자식과 부모 간의 통신을 위해 파이프를 생성하는 시나리오가 있습니다. 부모는 (쓰기 함수를 사용하여) 파이프에 데이터를 쓰고 각각의 파일 설명자를 닫습니다. 문제는 내가 파이프에 다시 데이터를 쓰려고 할 때 쓰기 함수가 오류 코드 -1을 반환한다는 것입니다. 나는 쓰기 끝이 이전 반복에서 닫혔 기 때문에 그것을 생각한다. 그런 다음 해당 파일 설명자가 한 번 닫힌 후에 해당 파일 설명자를 여는 방법.닫힌 파일 설명자를 다시 여는 방법

일부 파일의 경로가 arguement로 필요한 open() 함수를 사용해 보았습니다. 하지만 내 응용 프로그램에서 어떤 파일도 사용하고 있지 않습니다. 간단한 파일 기술자 (int arr [2])가 있습니다.

위의 시나리오를 파이프로 구현할 수 있습니까?

답변

10

일단 파이프가 닫히면 닫힙니다. 다시 가져올 수는 없습니다.

더 많이 쓰고 싶다면 처음부터 닫지 마십시오. 간단합니다.

+3

우리는 파일 기술자를 닫습니다 해달라고하면 2로 알려져있다 열려진 있습니다, 그것은 각각의 스트림에 EOF를 전송하지 않습니다. 따라서 자식 프로세스에서 입력을 위해 계속 대기합니다. 하지만 스트림의 제한된 횟수를 스트림에 쓰고 파이프의 다른 끝에서 동시에 읽고 싶습니다. – chaitu

+0

@chaitu : 쓰기 끝을 닫지 않으면 읽는 끝이 파일 끝을 표시하지 않습니다. . 즉, 자식에게 더 많은 메시지를 보내려면 메시지의 끝을 나타 내기 위해 파일 끝 이외의 것을 사용해야합니다 (일반적으로 고정 길이 메시지를 사용하여 자식이 얼마나 오래인지 알 수 있음). 그것은). – caf

1

unix에서 파일과 관련된 모든 것에 대해 알아야 할 것 : 파일 이름은 파일 열기에만 사용됩니다. 나중에 파일이 열릴 때까지는 닫을 때까지 영원히 사용할 수 있으며 이름은 다시 사용되지 않습니다. 다른 사람이 열려있는 동안 다른 창에서 파일을 삭제하면 파일이 아니라 이름 만 사라집니다. 이는 :

  1. 파일은 디스크에 여전히
  2. 그것은 어떤 이름이 아직도이 닫혀
  3. 는, 커널이 어쩌면 도움이 아는 영원히

그것을 제거 열려

  • 이 없습니다 파일, 파이프 또는 이와 유사한 것을 다시 "열 수있는"것이 거의 불가능한 이유를 이해해야합니다. 파일 이름과 설명자는 다른 수명을가집니다.

    유일한 예외는 표준 출력과 그 기술자는 항상 1

  • 관련 문제