Основы программирования в 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
.с
|
cat
wс
cat
и
wc
popen
Вызов pipe
Вы познакомились с высокоуровневой функцией
popen
pipe
У функции
pipe
<b>#include <unistd.h></b>
<b>int pipe(int file_descriptor[2]);</b>
Функции
pipe
errno
pipe
□
EMFILE
□
ENFILE
□
EFAULT
Два возвращаемых файловых дескриптора подсоединяются специальным образом. Любые данные, записанные в
file_descriptor[1]
file_descriptor[0]
1
2
3
file_descriptor[1]
file_descriptor[0]
1
2
3
Важно уяснить, что речь идет о файловых дескрипторах, а не о файловых потоках, поэтому для доступа к данным вы должны применять низкоуровневые системные вызовы
read
write
fread
fwrite
В упражнении 13.5 приведена программа pipe1.с, которая использует вызов
pipe
pipe
Следующий пример — программа pipe1.c. Обратите внимание на массив
file_pipes
pipe
#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);