Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
popenЭта программа применяет в точности предыдущую команду, но с помощью
popen#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>int main() { FILE *read_fp; char buffer[BUFSIZ +1]; int chars_read; memset(buffer, ' ', sizeof(buffer)); read_fp = popen("cat popen*.с | wc -l", "r"); if (read_fp != NULL) { chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp); while (chars_read > 0) { buffer[chars_read - 1] = ' '; printf("Reading:-n %sn", buffer); chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp); } pclose(read_fp); exit(EXIT_SUCCESS); } exit(EXIT_FAILURE);}Выполнив эту программу, вы получите следующий вывод:
$ <b>./popen4</b>Reading:-94Как это работает
Программа показывает, что вызывается командная оболочка для того, чтобы развернуть
popen*.сpopen.с|catwсcatиwcpopenВызов pipe
Вы познакомились с высокоуровневой функцией
popenpipeУ функции
pipe<b>#include <unistd.h></b><b>int pipe(int file_descriptor[2]);</b>Функции
pipeerrnopipe□
EMFILE□
ENFILE□
EFAULTДва возвращаемых файловых дескриптора подсоединяются специальным образом. Любые данные, записанные в
file_descriptor[1]file_descriptor[0]123file_descriptor[1]file_descriptor[0]123Важно уяснить, что речь идет о файловых дескрипторах, а не о файловых потоках, поэтому для доступа к данным вы должны применять низкоуровневые системные вызовы
readwritefreadfwriteВ упражнении 13.5 приведена программа pipe1.с, которая использует вызов
pipepipeСледующий пример — программа pipe1.c. Обратите внимание на массив
file_pipespipe#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>int main() { int data_processed; int filepipes[2]; const char some_data[] = "123"; char buffer[BUFSIZ + 1]; memset(buffer, ' ', sizeof(buffer)); if (pipe(file_pipes) == 0) { data_processed = write(file_pipes[1], some_data, strlen(somedata)); printf("Wrote %d bytesn", data_processed); data_processed = read(file_pipes[0], buffer, BUFSIZ); printf("Read %d bytes: %sn", data_processed, buffer);
