2011-12-12 18 views
7

Tôi đang cố gắng thiết kế/triển khai hàng đợi (tròn) (trong C) làm bộ nhớ dùng chung để có thể chia sẻ giữa nhiều luồng/quy trình.Thiết kế một Hàng đợi là bộ nhớ dùng chung

Cấu trúc hàng đợi là như sau:

typedef struct _q { 
    int q_size; 
    int q_front; 
    int q_rear; 
    int *q_data; 
}queue; 

nào hỗ trợ các chức năng sau:

int empty_q(queue *q); 
int display_q(queue *q); 
int create_q(queue **q, int size); 
int delete_q(queue **q); 
int enqueue(queue *q, int data); 
int dequeue(queue *q, int *data); 

Theo kích thước hàng đợi được đề cập bởi người dùng, bộ nhớ cho q_data sẽ được phân bổ trong create_q().

Câu hỏi: Cách tạo bộ nhớ dùng chung cho hàng đợi này bằng cách sử dụng các chức năng hệ thống được cung cấp trong "sys/shm.h"? Bất kỳ đoạn mã/ví dụ nào để tạo/đính kèm/truy xuất/xóa bộ nhớ chia sẻ cho cấu trúc dữ liệu hàng đợi bằng cách sử dụng shmget(), shmat(), shmctl(), vv sẽ là một trợ giúp tuyệt vời.

+0

Nếu bạn muốn giao tiếp các quy trình bằng cách sử dụng cơ chế giống hàng đợi, tốt hơn không nên sử dụng [hàng đợi tin nhắn] (http://www.it.uom.gr/teaching/c_marshall/node25.html)? Trên toàn bộ luồng từ cùng một quy trình, hàng đợi chuẩn được bảo vệ bởi một phần quan trọng sẽ đủ –

+0

@dario_ramos hàng đợi thư sẽ là giải pháp lý tưởng cho vấn đề này .. nhưng tôi đang cố gắng đưa ra một ví dụ bằng cách sử dụng hàng đợi để tìm hiểu cách đính kèm một cấu trúc dữ liệu với bộ nhớ dùng chung. –

+0

Trong trường hợp đó, khi tôi rối tung với Unix IPC, tôi đã theo [hướng dẫn của Beej về Unix IPC] (http://beej.us/guide/bgipc/). Nó thậm chí còn có một số câu chuyện cười! Bạn có thể truy cập trực tiếp vào [phần bộ nhớ chia sẻ] (http://beej.us/guide/bgipc/output/html/multipage/shm.html) –

Trả lời

2

Khi tôi nhầm lẫn với Unix IPC, tôi theo dõi Beej's guide to Unix IPC. Nó thậm chí còn có một số câu chuyện cười! Bạn có thể truy cập trực tiếp vào shared memory section. Nó có đoạn giải thích từng bước, và một ví dụ đầy đủ ở cuối.

+0

Hướng dẫn của Beej thật tuyệt vời. Cám ơn vì đã chia sẻ. :) –

+0

Tôi cũng đề cập đến điều này .. thông tin tương đối tốt. –

+0

Trông giống như một tài liệu tham khảo chi tiết hơn, tốt cho bạn. Chi tiết nhỏ: Xóa "<" and ">" khỏi liên kết của bạn, nếu không nó sẽ không hoạt động (tôi có thể thấy tài liệu vì tôi đã chỉnh sửa URL) –

4

Đây là một ví dụ đơn giản tạo bộ nhớ chia sẻ với kích thước của cấu trúc, viết một số dữ liệu vào nó và in ra. Chạy một thể hiện và nó sẽ tạo ra bộ nhớ chia sẻ và đặt một số "dữ liệu" vào nó, và sau đó chờ đợi một phím bấm. Chạy một thể hiện thứ hai trong một dấu nhắc lệnh khác, và cá thể thứ hai sẽ in nội dung của bộ nhớ.

typedef struct 
    { 
    char a[24]; 
    int i; 
    int j; 
    } somestruct; 


void fillshm(int shmid) { 
    somestruct *p; 

    if ((p = shmat (shmid, NULL, 0)) < 0) 
     { 
     perror("shmat"); 
     exit(1); 
     } 

    printf("writing to shared memory\n"); 
    strcpy(p->a, "my shared memory"); 
    p->i = 123; 
    p->j = 456; 
} 


void printshm(int shmid) 
{ 
    somestruct *p; 
    if ((p = shmat (shmid, NULL, 0)) < 0) 
     { 
     perror("shmat"); 
     exit(1); 
     } 

    printf("%s, %d, %d\n", p->a, p->i, p->j); 
} 

int main(int argc, char *argv[]) { 

    int shmid; 

    // see if the memory exists and print it if so 
    if ((shmid = shmget (1234, 0, 0)) >= 0) 
     printshm(shmid); 
    else 
     { 
     // didn't exist, so create it 
     if ((shmid = shmget (1234, sizeof(somestruct), IPC_CREAT | 0600)) < 0) 
     { 
     perror("shmget"); 
     exit(1); 
     } 

     printf("shmid = %d\n", shmid); 

     fillshm(shmid); 
     printf("Run another instance of this app to read the memory... (press a key): "); 
     getchar(); 

     // delete it 
     if (shmctl (shmid, IPC_RMID, NULL) < 0) 
     { 
     perror("semctl"); 
     exit(1); 
     } 
     } 

    return 0; 
} 
+0

Cảm ơn ví dụ. Điều này là chính xác (nhưng không đầy đủ). Bất kỳ ý tưởng về cách đính kèm/kết hợp một cấu trúc với một bộ nhớ chia sẻ? –

+0

@SangeethSaravanaraj: Gán bộ nhớ cho con trỏ tới cấu trúc. Giống như bộ nhớ từ cuộc gọi malloc. Bạn cần đảm bảo rằng mỗi quy trình có định nghĩa giống hệt nhau về cấu trúc (với cùng một bao bì). –

+0

@SangeethSaravanaraj: Để giải trí, tôi cập nhật ví dụ để sử dụng cấu trúc và thú vị hơn một chút (cho phép hai trường hợp hai chạy và có một lần điền vào bộ nhớ và một để in nó). –