2010-04-21 43 views
12

Tôi cần quá trình cha mẹ và con của tôi để cả hai có thể đọc và viết cùng một biến (của loại int) để nó là "toàn cầu" giữa hai quy trình.C - fork() và chia sẻ bộ nhớ

Tôi giả định điều này sẽ sử dụng một số loại giao tiếp chéo và có một biến trên một quá trình đang được cập nhật.

Tôi đã thực hiện nhanh chóng google và IPC và các kỹ thuật khác nhau xuất hiện nhưng tôi không biết cái nào phù hợp nhất với tình huống của tôi.

Vì vậy, kỹ thuật nào là tốt nhất và bạn có thể cung cấp liên kết đến hướng dẫn noobs cho nó hay không.

Cảm ơn.

Trả lời

15

Vì bạn đang nhắc đến sử dụng fork(), tôi cho rằng bạn đang sống trên một * nix-System

Từ Unix.com

Cách chính để chia sẻ dữ liệu giữa quá trình sử dụng UNIX TVV là :

(1) Bộ nhớ dùng chung;

(2) Sockets:

Có TVV UNIX khác bao gồm

(3) Nội dung bài Queues.

(4) Semaphores;

(5) Tín hiệu.

Đặt cược tốt nhất của bạn (cho IPC) là sử dụng phân đoạn bộ nhớ dùng chung, dựa trên bài đăng của bạn. Bạn có thể cần phải sử dụng semaphores để đảm bảo rằng bộ nhớ chia sẻ hoạt động là nguyên tử.

Một hướng dẫn về forking và bộ nhớ chia sẻ là trên dev kho:

http://forums.devshed.com/c-programming-42/posix-semaphore-example-using-fork-and-shared-memory-330419.html

khác mô tả sâu hơn của việc sử dụng đa luồng (nếu appilcable cho ứng dụng của bạn) có thể được tìm thấy ở đây:

https://computing.llnl.gov/tutorials/pthreads/

+0

Đã đến với bộ nhớ dùng chung ở cuối. – Cheetah

+2

Văn bản tương tự đáng ngờ ở đây (bạn có thể muốn liên kết tín dụng?): Http://www.unix.com/programming/857-fork-ipc.html – sje397

+0

@ sje397: Cảm ơn bạn đã chỉ ra cho tôi lỗi trích dẫn – sum1stolemyname

4

Nếu bạn cần chia sẻ bộ nhớ, có thể sử dụng chuỗi thay vì các quy trình sẽ là giải pháp tốt hơn?

+0

Bài tập của trường đại học. Bạn phải sử dụng fork() cụ thể là – Cheetah

2

Biến thể mà tôi đã sử dụng gần đây của bộ nhớ dùng chung là mở mmap trước khi tắt. Điều này tránh những hạn chế nhất định của api bộ nhớ dùng chung. Bạn không có giới hạn kích thước (phạm vi địa chỉ là giới hạn), bạn không cần phải tạo khóa từ tệp tuyệt đối đó. Dưới đây là ví dụ về cách tôi đã thực hiện (Tôi đã bỏ sót lỗi kiểm tra vì lợi ích ngắn gọn)

ppid = getpid(); 
shm_size = ...; 

char *tmpFile = tempnam(NULL, "SHM_"); /* Generate a temp file which is virtual */ 

/* Before we fork, build the communication memory maps */ 
mm = open(tmpFile, O_RDWR|O_CREAT|O_TRUNC, 0664)); /* Create the temp file */ 
ftruncate(mm, shm_size);        /* Size the file to the needed size, on modern Unices it's */ 
                 /* a sparse file which doesn't allocate anything in the file system */ 

/* The exact type of comm_area left to the implementer */ 
comm_area *pCom = (comm_area *)mmap(NULL, shm_size, PROT_READ|PROT_WRITE, MAP_SHARED, mm, 0); 
if(pCom == (comm_area*)MAP_FAILED) handle_error(); 
close(mm);        /* We can close the file, we won't access it via handle */ 
unlink(tmpFile);       /* We can also remove the file so even if we crash we won't let corpses lying */ 
free(tmpFile); 

/* Initialise some shared mutexes and semaphores */ 
pthread_mutexattr_t mattr; 
pthread_mutexattr_init(&mattr); 
pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED); 
pthread_mutex_init(&pCom->stderr_mutex, &mattr);   

/* nSonAsked, global variable with the number of forked processes asked */ 
for(nSon=0; nSon<nSonsAsked; nSon++) { 

    printf("Setup son #%.2u ",nSon+1); 
    /* Initialize a semaphore for each child process */ 
    sem_init(&pCom->sem_ch[nSon], USYNC_PROCESS, 0); 
    if(fork() == 0 { 
    ... /* do child stuff*/ 
    return; 
    } 
    /* Father, cleans up */ 
    pthread_mutexattr_destroy(&mattr); 
    ... 
    return; 
Các vấn đề liên quan