(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:
- Chánh dĩa()
- Child đọc() từ các đường ống cho đến khi EOF
- Chánh viết() để các đường ống sau đó đóng() nó
- 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:
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.
đườ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) –
Tùy thuộc vào nền tảng này. Bạn định chạy nền tảng nào? –