2012-01-16 25 views
6

Tôi đang tìm cách đơn giản nhất hoặc phù hợp nhất trên Mac OS X để chỉ đơn giản là "tín hiệu" hoặc thông báo cho một quy trình từ một quy trình khác. Đến từ một nền Windows này có thể đạt được bằng cách sử dụng một cái gì đó như sau.Mac OS X tương đương với CreateEvent() với đối tượng được đặt tên cho giao tiếp giữa các quá trình?

Trong Process A:

// create named event 
hCreatedEvent = CreateEvent(NULL, TRUE, FALSE, "MyUniqueNamedEvent"); 

// wait for it to be signalled 
WaitForSingleObject(hCreatedEvent, INFINITE); 

và sau đó trong quá trình B:

// open the existing named event 
hOpenedEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "MyUniqueNamedEvent"); 

// signal it 
SetEvent(hOpenedEvent); 

Vì vậy, khi cuộc gọi SetEvent trong Process B được thực thi, Quy trình A sẽ bùng phát từ WaitForSingleObject và làm một số công việc .

Tôi không thực sự gửi bất kỳ dữ liệu nào vì vậy tôi đã loại trừ những thứ như Ống có tên (FIFO) hoặc ổ cắm, v.v ... (tôi đã xem this similar question, nhưng khi cần để gửi dữ liệu, câu hỏi của tôi hơi khác một chút). Tương tự, tôi sẽ không biết PID của quá trình khác (đó là lý do tại sao tôi cần một số loại đối tượng chia sẻ) vì vậy tôi không thể sử dụng bất cứ điều gì mà sẽ yêu cầu điều đó.

Cho đến nay trên danh sách rút gọn của tôi là:

  • POSIX Semaphores - sử dụng sem_open, sem_waitsem_post để tạo/mở, chờ đợi trên và báo hiệu sự kiện tương ứng. Xuất hiện khá căng thẳng để sử dụng.
  • Các chức năng BSD notify(3) - xuất hiện khá đơn giản để sử dụng, nếu không phải là một chút khó khăn để tiêu thụ thông báo.
  • Các chức năng NSDistributedNotificationCenter hoặc CFNotificationCenter - xuất hiện hầu hết cách "Mac như" để thực hiện mọi việc và khá đơn giản. Tuy nhiên, mã của tôi có thể cần chạy dưới dạng dylib và theo số this unanswered question, mã đó có thể không hoạt động đối với tôi.

Vì vậy, có ai có bất kỳ lời khuyên/mẹo/câu chuyện kinh dị nào đã sử dụng bất kỳ giải pháp thay thế nào ở trên hoặc thậm chí phù hợp hơn mà tôi chưa từng đạt được những gì tôi muốn không?

Trả lời

4

Vì vậy, sau hơn một chút đào Cuối cùng tôi quyết định đi xuống Cột đường POSIX, mà dường như làm việc cho tôi, như vậy:

Trong Process A (chờ trên semaphore):

// create semaphore, fail if already exists 
sem_t *sem = sem_open("MyUniqueSemaphore", O_CREAT | O_EXCL, 0666, 0); 
if (sem != SEM_FAILED) 
{ 
    // wait on semaphore 
    if (sem_wait(sem) == 0) 
    { 
     // semaphore signalled! 
    } 

    // close our "handle" to the semaphore and remove it from the system 
    sem_close(sem); 
    sem_unlink("MyUniqueSemaphore"); 
} 

sau đó, trong quá trình b (tín hiệu semaphore):

// open the existing semaphore created in process A 
sem_t *sem = sem_open("MyUniqueSemaphore", 0); 
if (sem != SEM_FAILED) 
{ 
    // "signal" it 
    sem_post(sem); 

    // close our "handle" to the semaphore 
    sem_close(sem); 
} 

semaphore dường như cũng là một "tự động thiết lập lại" loại (trong Windows theo cách nói) để quay ngược lại cung unsignalled khi nó có b een báo hiệu.

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