Упражнение 13.57. Напишите программу, определяющую, возвращает ли fstat количество байт в FIFO в качестве поля size структуры tstat.
uses linux;
var
s:tstat;
begin
if paramcount<>1 then
begin
writeln('Используйте: ',paramstr(0),' имя_файла');
exit;
end;
if not fstat(paramstr(1),s) then
begin
writeln('Ошибка вызова stat для файла ',paramstr(1));
exit;
end;
writeln('Размер файла ',paramstr(1),' равен ',s.size);
end.
Упражнение 13.58. Напишите программу для определения того, что возвращает функция select при проверке возможности записи в дескриптор канала, у которого закрыт второй конец.
uses linux;
var
fds:fdset;
fdin,fdout,ret:longint;
begin
if not assignpipe(fdin,fdout) then
begin
writeln('Ошибка создания программного канала');
exit;
end;
fd_zero(fds);
fd_set(fdin,fds);
fd_set(fdout,fds);
fdwrite(fdout,'Некая достаточно длинная строка',31);
fdclose(fdin);
writeln('Вызов select');
ret:=select(2,nil,@fds,nil,1000);
writeln('select вернул ',ret);
end.
Упражнение 13.59. Используя канал между родителем (клиентом) и потомком (сервером), создайте программу, в которой клиент считывает имя файла из стандартного ввода и записывает в канал. Если файл существует, сервер считывает его и записывает в канал, в противном случае возвращает клиенту сообщение об ошибке.
uses linux,sysutils;
const
BLOCKSIZE=1024;
var
pid,(*идентификатор процесса*)
filesize,(*размер файла*)
fd,(*дескриптор файла*)
kol,(*количество прочитанных байт*)
i:longint;
in1,out1,in2,out2:longint;(*дескрипторы программных каналов*)
filename:string[80];
st:tstat;(*для получения информации о размере файла*)
buf:array[0..BLOCKSIZE-1]of char;(*буфер чтения-записи*)
begin
(*попытка создания двух программных каналов*)
if not assignpipe(in1,out1) then
begin
writeln('Ошибка создания первого программного канала');