Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Такой же вывод можно получить из командной строки с помощью следующей команды:
$ <b>echo "Once upon a time, there was..." | od -c</b>
Передача данных большого объема
Механизм, применявшийся до сих пор, просто отправляет и получает все данные в одном вызове
fread
fwrite
fread
fwrite
В упражнении 13.3 приведена программа popen3.c, читающая все данные из канала.
В этой программе вы читаете данные из вызванного процесса
ps ах
#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("ps ax", "r");
if(read_fp != NULL) {
chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp);
while (chars_read > 0) {
buffer[chars_read - 1] = ' ';
printf("Reading %d:-n %sn", BUFSIZ, buffer);
chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp);
}
pclose(read_fp);
exit(EXIT_SUCCESS);
}
exit(EXIT_FAILURE);
}
Вывод, отредактированный для краткости, подобен приведенному далее:
$ <b>./popen3</b>
Reading 1024:-
PID TTY STAT TIME COMMAND
1 ? Ss 0:03 init [5]
2 ? SW 0:00 [kflushd]
3 ? SW 0:00 [kpiod]
4 ? SW 0:00 [kswapd]
5 ? SW< 0:00 [mdrecoveryd]
...
240 tty2 S 0:02 emacs draft1.txt
Reading 1024:-
368 tty1 S 0:00 ./popen 3
369 tty1 R 0:00 ps -ax
370 ...
Как это работает
Программа применяет функцию
popen
"r"
ps
ps
В этом примере строка
Reading:-
BUFSIZ
ps
BUFSIZ
BUFSIZ
BUFSIZ/10
Как реализован вызов popen
Вызов
popen
sh
В ОС Linux (как и во всех UNIX-подобных системах) подстановка всех параметров выполняется командной оболочкой, поэтому вызов оболочки для синтаксического анализа командной строки перед вызовом программы дает возможность командной оболочке выполнить любую подстановку, например, определить реальные файлы, на которые ссылается строка *.с до того, как программа начнет выполняться. Часто это очень полезно и позволяет запускать с помощью
popen
execl
Нежелательный эффект применения командной оболочки состоит в том, что для каждого вызова
popen
popen
popen
В упражнении 13.4 приведена программа popen4.c, которую можно использовать для демонстрации поведения
popen
popen
cat
wc -l
$ <b>cat popen*.c | wc -l</b>
На самом деле
wc -l popen*.c