Межпроцессного взаимодействия (IPC) относится к распространению и обмену данными между различными процессами, каждый из которых имеет различный процесс для каждого адресного пространства пользователя (виртуального адресного пространства), процесс любой глобальной переменной в другом процессе не мог видеть, так для обмена данные между процессами могут быть ядром, открыть буфер в ядре, процесс копирования данных из пользовательского пространства в буфер ядра, а затем скопировать данные из буфера ядра процесса в, чтобы иметь пространство пользователя, предоставляемое ядро это называется механизмом межпроцессного взаимодействия; механизм под Linux, МПК разделена на: трубы, семафоры, совместно используемой памяти, очереди сообщений, розетки;
Во-первых, трубопровод
1 мысль: Вызов функции трубы в ядре будет открыть трубу, называемую буфер файл, который содержит чтение конца и конец записи, межпроцессное взаимодействие через буферную зону;
2 Особенности: половина формы, родитель и ребенок, поставляется с механизмом синхронизации;
Использование 3: Создание родителя требует трубопровода трубы, чтобы получить два дескриптора файла FD [2], Fd [0] -readable, Fd [1] можно записать, раскошелиться дочерний процесс родительского процесса, дочерний процесс также описан в двух, чтобы дать фу Fd [2]; родитель закрытие конца чтения FD [0], ребенок закрывает торцевые записи FD [1], так что родительский процесс к трубе для записи данных, дочерний процесс, чтобы считывать данные из трубы, труба представляет собой круговую очередь внедрено , данные записи с конца притока, оттока из конца чтения; следующим образом:
(1) читать трубопровод, если трубопровод пустые блоки до конца записи данных записи на запись в трубопроводе; написать сторона закрыта, если возвращается 0;
(2) написать трубопровод, если трубопровод полон, не блокируя до конца чтения трубопровода считывания данных внутренних удален; конец закрыт, если ошибка чтения возвращается -1, генерирует сигнал SIGPIPE;
4 кода осуществляется следующим образом:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <unistd.h> 3 #include < строка .h> 4 5 #define ABCDE "ABCDE" 6 #define FGHIJ "FGHIJ" 7 8 INT основных ( INT ARGC, символ * ARGV []) 9 { 10 INT FD [ 2 ] = { 0 }, размер = 0 ; 11 pid_t PID = - 1 ; 12 символ BUF [ 256 ] = { 0 }; 13 14 , если (трубы (FD)) // 1 труба 15 { 16 PError ( " трубы " ); 17 возвращение 1 ; 18 } 19 PID = вилка (); // 2 вилки 20 , если (PID < 0 ) 21 { 22 PError ( " вилка " ); 23 возврата 2 ; 24 } 25 еще если (PID == 0 ) //3 ребенок записи FD [1] 26 { 27 Е ( " ребенок старт \ п " ); 28 близко (FD [ 0 ]); 29 размер = запись (FD [ 1 ], ABCDE, 5 ); 30 Е ( " ребенок, тзд =% s, размер =% d \ п " , ABCDE, размер); 31 // сна (1); 32 размер = запись (FD [ 1 ], FGHIJ, 5 ); 33 Е ( " ребенок, тзд =% s, размер =% d \ п " , FGHIJ, размер); 34 } 35 еще // 3 отец прочитал Fd [0] 36 { 37 Е ( " отец начать \ N " ); 38 близко (FD [ 1 ]); 39 // сон (1); 40 размера = чтение (FD [ 0 ], ЬиЙ, 256 ); // блок , пока ребенок не записи Fd [1] 41 Е ( " отец, тзд =% s, размер =% d \ N " , BUF, размер); 42 MemSet (BUF, 0 , SizeOf (BUF)); 43 размера = чтение (FD [ 0], ЬиЙ, 256 ); // блок , пока ребенок не записи Fd [1] 44 Е ( " отец, тзд =% s, размер =% d \ N " , BUF, размер); 45 } 46 возврата 0 ; 47 }
II.