나는이 link에서 아래의 코드를 말하는 겁니다 : - 부모와 자식다른 프로세스에서 포크 후 디스크립터를 사용할 수 없게 되었습니까?
while (1)
{
newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0)
error("ERROR on accept");
pid = fork();
if (pid < 0)
error("ERROR on fork");
if (pid == 0)
{
close(sockfd);
dostuff(newsockfd);
exit(0);
}
else
close(newsockfd);
} /* end of while */
void dostuff (int sock)
{
int n;
char buffer[256];
bzero(buffer,256);
n = read(sock,buffer,255);
if (n < 0) error("ERROR reading from socket");
printf("Here is the message: %s\n",buffer);
n = write(sock,"I got your message",18);
if (n < 0) error("ERROR writing to socket");
}
를 포크() 호출 후, 두 프로세스가 될 것입니다.
부모 프로세스의 경우 else 부분은 true를 유지하므로 newsockfd를 닫습니다. 그러나 newsockfd는 dostuff 메소드에서 읽기 및 쓰기 시스템 호출을 위해 자식 프로세스에 의해 사용됩니다. 이 경우 읽기 및 쓰기 시스템 호출에 실패하지 않습니까?
아이는'exit (0)'을 호출하지 말고'_exit (0)'을 호출해야합니다. 그렇지 않으면, 당신은'fork'에 대한 호출에서 두 번 존재했던 모든 스트림을 플러시합니다. 이 예제에서는 중요하지 않지만 더 현실적인 경우에는 좋은 예를 설정합니다. –
'fork()'가 반환되면 두 프로세스가 분리됩니다. 그들은 같은 열린 파일 기술을 가리키는 기술 어의 사본을 가지고있다. 한 프로세스에서 close가 다른 프로세스에 영향을 미치지는 않습니다 (다른 프로세스를 열린 파일 설명의 유일한 소유자로 만드는 것 이상). 파일 기술자와 열린 파일 기술을 구별하는 방법은 [POSIX'open()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/openat.html)을 참고하십시오. 'dup2()','fork()'등 –