Tôi cần tạo một ứng dụng linux có thể quét mạng không dây, đặt kết quả vào một cấu trúc và gửi nó bằng cách nào đó, ứng dụng chính sẽ sử dụng dữ liệu. Ý tưởng ban đầu của tôi là tạo một đường ống trong ứng dụng chính, ngã ba và bắt đầu một quá trình khác bằng execl, có thể ghi vào đường ống. Một cái gì đó như thế này:Làm thế nào để trao đổi dữ liệu nhị phân giữa các quy trình trong Linux
pid_t pid = NULL;
int pipefd[2];
FILE* output;
char line[256];
pipe(pipefd);
pid = fork();
if (pid == 0)
{
// Child
close(pipefd[0]);
dup2(pipefd[1], STDOUT_FILENO);
dup2(pipefd[1], STDERR_FILENO);
execl("/sbin/wifiscan", "/sbin/wifiscan", (char*) NULL);
}
//Only parent gets here. Listen to what the wifi scan says
close(pipefd[1]);
output = fdopen(pipefd[0], "r");
while(fgets(line, sizeof(line), output))
{
//Here we can listen to what wifiscan sends to its standard output
}
Tuy nhiên, điều này sẽ không hoạt động với dữ liệu nhị phân, nếu nhị phân 0 xuất hiện ở đầu ra. Vì vậy, tôi có thể định dạng đầu ra của ứng dụng wifiscan thành văn bản, gửi nó vào đường ống và phân tích cú pháp trong ứng dụng chính hoặc làm theo cách thông minh hơn mà tôi chưa biết.
Các phương tiện khác để trao đổi dữ liệu đáng tin cậy giữa các quy trình trong Linux là gì?
'ftell()' có thể không hoạt động trên các luồng không thể dò tìm như đường ống. – caf
Tôi đồng ý với việc xây dựng một giao thức cơ bản cho dữ liệu của bạn và sau đó sử dụng 'fread()' thay vì 'fgets()'. Câu trả lời này về [triển khai FIFO] (http://stackoverflow.com/q/2870549/203667) [answer] (http://stackoverflow.com/questions/2870549/fifos-implementation/2871538#2871538) có thể được sử dụng bổ sung vì nó cung cấp một vài ví dụ về cách một giao thức như vậy có thể được xây dựng. – jschmier
fread() hoạt động hoàn hảo. Cảm ơn – Patryk