Đây là loại câu hỏi kỹ thuật, có thể bạn có thể giúp tôi nếu bạn biết về C và UNIX (hoặc có thể nó là một câu hỏi thực sự người mới!)Về con trỏ sau khi fork()
Một câu hỏi nảy ra trong phiên hôm nay analizing một số mã trong khóa học Hệ điều hành của chúng tôi. Chúng tôi đang học những gì nó có nghĩa là "ngã ba" một quá trình trong UNIX, chúng tôi đã biết nó tạo ra một bản sao của quá trình hiện tại song song với nó và họ có phần dữ liệu riêng biệt. Nhưng sau đó tôi nghĩ rằng có thể, nếu người ta tạo ra một biến và một con trỏ trỏ vào nó trước khi làm fork(), vì con trỏ lưu trữ địa chỉ bộ nhớ của biến, người ta có thể cố gắng sửa đổi giá trị của biến đó từ quá trình con bằng cách sử dụng con trỏ đó.
Chúng tôi đã thử một mã tương tự như sau trong lớp:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
int main(){
int value = 0;
int * pointer = &value;
int status;
pid_t pid;
printf("Parent: Initial value is %d\n",value);
pid = fork();
switch(pid){
case -1: //Error (maybe?)
printf("Fork error, WTF?\n");
exit(-1);
case 0: //Child process
printf("\tChild: I'll try to change the value\n\tChild: The pointer value is %p\n",pointer);
(*pointer) = 1;
printf("\tChild: I've set the value to %d\n",(*pointer));
exit(EXIT_SUCCESS);
break;
}
while(pid != wait(&status)); //Wait for the child process
printf("Parent: the pointer value is %p\nParent: The value is %d\n",pointer,value);
return 0;
}
Nếu bạn chạy nó, bạn sẽ nhận được một cái gì đó như thế này:
phụ huynh: Giá trị ban đầu là 0
Trẻ em: Tôi sẽ cố gắng thay đổi giá trị
Con: Giá trị con trỏ là 0x7fff733b0c6c
Trẻ em: tôi đã thiết lập các giá trị cho 1
phụ huynh: giá trị con trỏ là 0x7fff733b0c6c
phụ huynh: Giá trị là 0
Rõ ràng rằng quá trình đứa trẻ không ảnh hưởng đến ở tất cả quy trình gốc. Thành thật mà nói, tôi đã mong đợi một số lỗi "phân đoạn lỗi", vì truy cập vào một địa chỉ bộ nhớ không được phép. Nhưng những gì thực sự đã xảy ra?
Hãy nhớ rằng, tôi không tìm cách để giao tiếp quy trình, đó không phải là vấn đề. Những gì tôi muốn biết là mã đã làm gì. Bên trong quá trình con, thay đổi có thể nhìn thấy, do đó, nó DID một cái gì đó.
Giả thuyết chính của tôi là con trỏ không tuyệt đối với bộ nhớ, chúng có liên quan đến ngăn xếp của quy trình. Nhưng tôi đã không thể tìm thấy câu trả lời (không ai trong lớp biết, và googling tôi chỉ tìm thấy một số câu hỏi về quá trình giao tiếp) vì vậy tôi muốn biết từ bạn, hy vọng ai đó sẽ biết.
Cảm ơn bạn đã dành thời gian đọc!
bạn có thể đặt 'printf (" Parent: giá trị con trỏ là% p \ nGiá trị là% d \ n ", con trỏ, giá trị);' trong trường hợp mặc định của 'switch()' – Haris
http://en.wikipedia.org/wiki/Virtual_memory – Mat
"* Thành thật mà nói, tôi đã mong đợi một số lỗi" phân đoạn lỗi ", vì truy cập vào một địa chỉ bộ nhớ không được phép. *" Điều đó không có ý nghĩa. Hãy suy nghĩ về nó. Mã mà đứa trẻ thực hiện là hoàn toàn hợp pháp. Câu hỏi duy nhất là - nó có hay không ảnh hưởng đến cha mẹ? –