Đây là mã của tôiTại sao địa chỉ của biến của quá trình đứa trẻ và quá trình cha mẹ là giống
int main()
{
pid_t pid;
int y = 3;
if ((pid = fork()) <0)
return -1;;
if(pid == 0) /* child */
{
printf(" before: %d %p\n", y, &y);
y *= 10;
printf("after: %d %p\n", y, &y);
}
else /* father */
{
sleep(1);
printf("father: %d %p\n" , y , &y);
}
return 0;
}
Đầu ra của chương trình là như sau:
before: 3 ffbff440
after: 30 ffbff440
father: 3 ffbff440
Câu hỏi của tôi là tại sao là địa chỉ của biến của trẻ và cha mẹ giống nhau nhưng giá trị khác nhau?
Cũng lưu ý rằng nó phải theo cách này. Nếu địa chỉ của 'y' đã thay đổi, thì bất kỳ con trỏ (địa chỉ) nào được giữ trong các biến hoặc cấu trúc trước khi ngã ba sẽ không còn chính xác nữa sau ngã ba. Điều đó sẽ làm cho ngã ba ít hữu ích hơn, vì quá trình con sẽ không thể truy cập bất kỳ cấu trúc dữ liệu nào (danh sách liên kết, cây) hoặc dữ liệu được phân bổ động từ trước, vì những thứ đó dựa vào con trỏ. Các hệ thống không có bộ nhớ ảo khá nhiều không thể thực hiện ngã ba, thay vào đó bạn nhận được vfork (http://pubs.opengroup.org/onlinepubs/7908799/xsh/vfork.html). –
Về mặt kỹ thuật, bạn có thể sử dụng hai con trỏ vô hướng cung cấp thời gian chạy C của bạn (nói cách khác, một con trỏ là một giá trị đã biết và khi chuyển đổi, bạn di chuyển dữ liệu đến nơi khác con và điều chỉnh giá trị đã biết). Nó sẽ là một kẻ giết người hiệu suất mặc dù. Tôi nghĩ rằng chế độ thực Windows đã làm một cái gì đó tương tự như thế này với khóa và mở khóa bộ nhớ. – paxdiablo
Đủ công bằng, về cơ bản bạn đã mô tả một cách rẻ tiền và vui vẻ (hoặc đắt tiền và khổ sở, tùy thuộc vào cách bạn nhìn vào nó) phần mềm thực hiện bộ nhớ ảo. Trong trường hợp đó, bạn vẫn sẽ thấy những gì người hỏi quan sát, rằng địa chỉ trước và sau khi ngã ba in như cùng một giá trị. Trừ khi trình định dạng in '% p' cũng được thêm vào địa chỉ cơ sở, tôi giả sử :-) –