2011-06-23 38 views
7

Tôi đã xem bài đăng tương tự duy nhất tôi có thể tìm thấy, nhưng đó không phải là những gì tôi đang tìm kiếm.Sử dụng bộ nhớ dùng chung với fork()

Về cơ bản, tôi đang cố gắng chạy số Odd-Even Sort với forking, do đó, con chạy tỷ lệ cược và cha mẹ sẽ chạy quảng cáo. Cả hai yêu cầu chia sẻ của inputValues ​​vector, cũng như các boolean được sắp xếp.

Các mã sau đây là không có bất kỳ nỗ lực thất bại của tôi lúc chia sẻ bộ nhớ, và chỉ là khuôn khổ cơ bản cho việc sử dụng dĩa với các thuật toán tìm kiếm:

while(!sorted) 
{ 
    pID = fork(); 
    sorted = true; 
    cout << "Sort set to TRUE." << endl; 

    if(pID == 0) 
    { 
     int num = 1; 
     cout << "Child swap run" << endl; 
     Swap((void *) num); 
     cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl; 
     exit(0); 
    } 
    else if(pID < 0) 
    { 
     cout << "Failed to fork." << endl; 
     exit(1); 
    } 
    else 
    { 
     wpid = waitpid(pID, &status, waitStatus); 
     int num = 0; 
     cout << "Parent swap run" << endl; 
     Swap((void *) num); 
     cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl; 
    } 
} 

Tôi đã thử nhiều cách hack ra chia sẻ này bộ nhớ, nhưng không thể tìm thấy bất kỳ tài nguyên nào thực sự giải thích CÁCH nó hoạt động, những gì tôi cần và cách tốt nhất để làm điều đó.

Vì vậy, yêu cầu của tôi như sau:

  • Cha mẹ và con phải có khả năng chia sẻ và thao tác một vector toàn cầu và boolean
  • này phải có khả năng chạy trong một vòng lặp, như
  • Điều này phải hoạt động với các biến được sử dụng trong hàm main() và trong hàm hoán đổi()

Nếu bạn có bất kỳ mẹo nào, tôi đánh giá cao chúng. Cảm ơn!

+0

Hãy xem trang người dùng cho lệnh gọi API 'shm_open' POSIX. Bạn muốn tạo một vùng nhớ chia sẻ và đặt bất kỳ biến nào được truy cập bởi cả hai quy trình ở đó. Bạn cũng có thể làm điều này với cuộc gọi 'mmap' khá dễ dàng. Hãy chắc chắn để làm cho truy cập của bạn an toàn thread ... Không có khóa vốn có trong việc sử dụng bộ nhớ chia sẻ, vì vậy bạn phải chăm sóc. – Borealid

+0

Hãy nhớ với 'shm_open' bạn sẽ cần phải gọi' ftruncate' để phân bổ không gian cho đối tượng bộ nhớ chia sẻ, do đó, một lần nữa, khoảng trống trong đối tượng bộ nhớ sẽ không phát triển tự động như bạn thấy với 'std :: vectơ'. Bạn sẽ phải tự quản lý kích thước của đối tượng bộ nhớ chia sẻ khi chạy nếu bạn cần nhiều không gian hơn. – Jason

+0

Điều này khá rõ ràng không phải là mã C. – Puppy

Trả lời

4

Bạn sẽ phải sử dụng shmget()shmat() để thiết lập đối tượng bộ nhớ dùng chung, nhưng tiếc là sẽ không phải là đối tượng bộ nhớ động như số std::vector. Nói cách khác, bạn sẽ phải khai báo toàn bộ kích thước của đối tượng tại thời điểm khởi tạo đối tượng bộ nhớ dùng chung. Quá trình này mặc dù là khá thẳng về phía trước, trong đó trong cha mẹ của bạn, bạn sẽ gọi shmget() với cờ IPC_CREAT để tạo đối tượng bộ nhớ chia sẻ và nhận giá trị ID cho đối tượng. Sau đó, gọi shmat() bằng giá trị ID để nhận con trỏ đến đối tượng. Tiếp theo, khởi tạo đối tượng với các giá trị mặc định. Khi bạn ngã ba vào quá trình con của bạn, con trỏ trở về từ shmat() sẽ vẫn hợp lệ trong quá trình con, vì vậy bạn có thể chia sẻ bộ nhớ trong cả cha lẫn mẹ bằng cách sử dụng cùng một biến con trỏ.

Bạn cũng sẽ muốn khai báo trong quá trình cha mẹ trước khi bạn ngã ba bất kỳ trẻ em nào semaphore sử dụng sem_init() với thuộc tính pshared được đặt thành giá trị lớn hơn 0. Sau đó, cả hai quá trình cha mẹ và con có thể sử dụng semaphore để kiểm soát truy cập vào đối tượng bộ nhớ chia sẻ.

Một lần nữa, hãy nhớ rằng đối tượng bộ nhớ dùng chung không phải là đối tượng động, vì vậy bạn cần phân bổ đủ không gian cho đối tượng đó khi khởi tạo.

Các vấn đề liên quan