2013-01-05 45 views
5

Tôi cần một số cách để quy trình phụ huynh liên lạc riêng với từng đứa trẻ.Thông tin liên lạc cho phụ huynh về con của phụ huynh

Tôi có một số trẻ em cần giao tiếp với cha mẹ riêng biệt với các trẻ khác.

Có cách nào để phụ huynh có kênh giao tiếp riêng tư với từng trẻ không? Ví dụ:

Ví dụ: có thể gửi cho cha một biến cấu trúc?

Tôi là người mới đối với những thứ như vậy nên mọi sự trợ giúp đều được đánh giá cao. Cảm ơn bạn

+0

đường ống! http://www.gnu.org/software/libc/manual/html_node/Pipes-and-FIFOs.html (hãy nhớ rằng bạn phải tạo đường ống trước khi tắt, nếu không chúng không thể giao tiếp) –

+2

Tùy thuộc vào nền tảng này. Bạn định chạy nền tảng nào? –

Trả lời

22

(Tôi chỉ sẽ giả sử chúng ta đang nói ở đây linux)

Như bạn có thể phát hiện ra, fork() tự nó sẽ chỉ lặp lại trong quá trình gọi điện thoại, nó không xử lý IPC.

Từ thủ ngã ba:

fork() tạo ra một quy trình mới bằng cách sao chép quá trình gọi. Quy trình mới, được gọi là trẻ em, là bản sao chính xác của quy trình gọi điện, được gọi là cha mẹ.

Cách phổ biến nhất để xử lý IPC khi bạn chia tay() là sử dụng đường ống, đặc biệt nếu bạn muốn "một kênh liên lạc riêng với mỗi đứa trẻ". Dưới đây là một ví dụ điển hình và dễ dàng sử dụng, tương tự như bạn có thể tìm thấy trong cuốn hướng dẫn pipe (giá trị trả lại không được kiểm tra):

#include <sys/wait.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <unistd.h> 
    #include <string.h> 

    int 
    main(int argc, char * argv[]) 
    { 
     int pipefd[2]; 
     pid_t cpid; 
     char buf; 

     pipe(pipefd); // create the pipe 
     cpid = fork(); // duplicate the current process 
     if (cpid == 0) // if I am the child then 
     { 
      close(pipefd[1]); // close the write-end of the pipe, I'm not going to use it 
      while (read(pipefd[0], &buf, 1) > 0) // read while EOF 
       write(1, &buf, 1); 
      write(1, "\n", 1); 
      close(pipefd[0]); // close the read-end of the pipe 
      exit(EXIT_SUCCESS); 
     } 
     else // if I am the parent then 
     { 
      close(pipefd[0]); // close the read-end of the pipe, I'm not going to use it 
      write(pipefd[1], argv[1], strlen(argv[1])); // send the content of argv[1] to the reader 
      close(pipefd[1]); // close the write-end of the pipe, thus sending EOF to the reader 
      wait(NULL); // wait for the child process to exit before I do the same 
      exit(EXIT_SUCCESS); 
     } 
     return 0; 
    } 

Mã này là khá tự giải thích:

  1. Chánh dĩa()
  2. Child đọc() từ các đường ống cho đến khi EOF
  3. Chánh viết() để các đường ống sau đó đóng() nó
  4. Datas đã được chia sẻ, hoan hô!

Từ đó bạn có thể làm bất cứ điều gì bạn muốn; chỉ cần nhớ kiểm tra các giá trị trả về của bạn và đọc các tài liệu hướng dẫn sử dụng dup, pipe, fork, wait ... chúng sẽ có ích.

Ngoài ra còn có một loạt các cách khác để chia sẻ dữ liệu ngay giữa các quá trình, họ migh bạn quan tâm mặc dù họ không đáp ứng của bạn "tin" yêu cầu:

  • shared memory "SHM", tên nói lên tất cả ...
  • sockets, họ rõ ràng là làm việc tốt nếu được sử dụng tại địa phương
  • FIFO files mà về cơ bản ống với một tên

hoặc đêm trước na tập tin đơn giản ... (Tôi thậm chí đã sử dụng SIGUSR1/2 signals để gửi dữ liệu nhị phân giữa các quá trình một lần ... Nhưng tôi sẽ không khuyên bạn nên haha.) Và có lẽ một số chi tiết mà tôi không suy nghĩ về ngay bây giờ .

Chúc may mắn.

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