fork()를 사용하여 상위 프로세스와 하위 프로세스를 작성했으며 "ptr"이라는 메모리 주소를 공유합니다. 하지만 프로그램의 한 출력으로 인해 혼란 스럽습니다.fork() 시스템 호출에서 혼동 됨
주소 : 1) ptr : 123456 의 주소 주 : 하나의 프로세스가이 주소를 변경하면 동일한 부모와 자식 주소가 동일하므로 변경 사항이 반영되어야합니다. 주소가 동일하기 때문에 다른 너무 프로세스.
2) 상위 : * PTR = 44
3) 아이 * PTR = 33
4) 인쇄 값 : 부모가 여전히 이전 값을 유지한다 :의 printf ("PTR = % d의"* ptr); // 출력 : 여전히 44, exp는 33입니다. 자식이 예상 값 33을 인쇄합니다. printf ("ptr = % d", * ptr); // 인쇄 33 잘
질문 1) 아무도 말해 줄 수있는 값이 어떻게 다른가요? 포인터 주소는 부모와 자식 모두 동일하지만?
질문 2) 나는 부모와 자녀가 동일한 주소를 무료로 볼 수 있으므로 오류가 두 번 주어지는 메모리 누수 도구를 만들고 있습니다. 그러나, 우리가 보는 바와 같이 그것은 두 배의 자유의 경우가 아닙니다. 이 문제를 어떻게 분류합니까? 도구가 부모와 자식에 대해 보는 메모리 주소가 같은 addrerss입니까?
PS : 아래의 코드를 참조하십시오
#include <sys/types.h>
#include <unistd.h>
#include <cstdlib>
int main()
{
int pid, *ptr
ptr=(int*)malloc(sizeof(int));
*ptr=33; // Parent keeps the data as 33, before forking.
if(pid==0){*ptr=44;} // Child modifies data, which is ignored by parent
// Now we print the memory address and the value both by child and parent
if(pid==0)
{
printf("Child data: %u\n",*ptr);
printf("Child address: %u\n",ptr);
}
if(pid>0)
{
printf("Parent data: %u\n",*ptr);
printf("Parent address: %u\n",ptr);
}
}
출력 : 아이 데이터 : 44 아이 주소 : 123456
부모 데이터 : (? 여전히 이전 값을 제공하는 방법) (33) 부모 주소 : 123456 (주소는 어떻게되지만 어린이와 다른 데이터는 어떨까요?)
부모와 자식은'fork()'이후에 독립적입니다. 즉, 서로의 데이터를 볼 수 없습니다. 사용자가 모든 데이터를 공유하도록하려면 스레드 대신 사용하는 것이 좋습니다. – Gabe
질문에 대한 답변 2 : 도구에서 무료로 제공되는 도구는 무엇입니까? 프로세스 컨텍스트 내에서 실행 중이면 하나만 볼 수 있습니다. malloc이 다시 호출되는 한 동일한 주소에 여러 개의 free가 유효합니다! 그래서 주소를 보면 당신을 아주 멀리하지 못할 것입니다 ... –