2016-05-30 3 views
1

im пытается создать две программы (A и B) в C. A отправляет массив символов в B, B ставит другой символ в массиве символов, который он получил от A, и отправляет обратно в A После того как A получил улучшенный массив символов из B, он распечатает его.IPC в C с именованными трубами

Проблема заключается в том, что я не знаю, как сказать, что он должен печатать первым, когда он получил улучшенный массив символов назад от B

Может кто-нибудь помочь, пожалуйста?

+0

Вам, вероятно, необходимо определить протокол, чтобы B знал, когда A отправлена, и так, что A знает, когда B выполняется отправка. Если вы отправляете массивы символов по одному символу за раз с новой линией между ними, вы можете пометить конец массива, отправив '' END \ n "'. –

+0

Что вы пробовали? Можете ли вы [включить] (http://stackoverflow.com/help/mcve) соответствующий раздел вашего кода? –

+0

im new in stackoverflow, я написал код в редакторе vim в оболочке, вот почему я не могу скопировать его и вставить здесь. Я снимаю экран и загружаю его здесь: http://www2.pic-upload.de/img/30808319/Untitled.png Другая программа просто читает трубку и записывает в нее расширенный массив символов – Pachamachai

ответ

0
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/stat.h> 
#include <stdio.h> 

int main() { 
     // Here we use A and B as parent and child, made by fork 
     // This allows us to pass pipe FDs 
     int inpipe[2]; 
     int outpipe[2]; 
     pipe(inpipe); 
     pipe(outpipe); 
     const int arr_len = 4; 
     const char buf[arr_len] = "ABD"; // Character [3] is implicit NUL 
     int x = fork(); 
     if(x == -1) { 
       perror("Fork error"); 
     } 
     if(x == 0) { 
       // Child 
       char my_buf[arr_len]; 
       read(inpipe[0], my_buf, arr_len); 
       // Improve it 
       my_buf[2] = 'C'; // ABC looks better than ABD 
       // Send it back 
       write(outpipe[1], my_buf, arr_len); 
       exit(0); 
     } 
     char my_buf[4]; 
     write(inpipe[1], buf, arr_len); 
     // Will lock waiting for data 
     read(outpipe[0], my_buf, arr_len); 
     // Close pipes 
     close(inpipe[0]); 
     close(inpipe[1]); 
     close(outpipe[0]); 
     close(outpipe[1]); 
     // Dump it 
     printf("%s\n", my_buf); 
     return 0; 
} 

Попробуйте запустить этот пример и увидите, что он отправляет массив между двумя процессами. Если кто-то не развивает другой, единственная проблема заключается в использовании именованных каналов (замените pipe вызов с вызовом mkfifo и некоторые другие изменения). Не стесняйтесь основываться на этом примере. Также обратите внимание на это:

int ifd = mypipe[0], ofd = mypipe[1]; // mypipe is got somewhere before 
FILE *istream = fdopen(ifd, "r"), ostream = fdopen(ofd, "w"); 
// Now use any stdio functions on istream and ostream 
+0

Большое спасибо Якуб, я попробую его когда-нибудь домой на моем ноутбуке. Когда я хочу сделать это в двух разных процессах, мне нужно только экспортировать дочерний блок в другую функцию? Затем мне нужно запустить A для массива char, затем B, чтобы записать его обратно, затем A снова для печати результата – Pachamachai

+0

Да. Также помните, что часть с 'int [2]' s возможна только на 'fork'ed процессе. Чтобы использовать его между двумя независимыми процессами, вам нужны именованные каналы (или Linux 'procfs'). См. Man-страницы: 'pipe (2)', 'mkfifo (1)', 'mkfifo (3)'. В procfs для доступа к FD-файлам другого процесса в качестве обычных файлов используйте путь: '/ proc//fd/'. –