SYSTEM CALL: pipe();
PROTOTYPE: int pipe( int fd[2] );
RETURNS: 0 в случае успеха
-1 в случае ошибки:
errno = EMFILE (нет свободных дескрипторов)
EMFILE (системная файловая таблица переполнена)
EFAULT (массив fd некорректен)
NOTES: fd[0] устанавливается для чтения, fd[1] - для записи.
реализация команды cat filename|sort
Нужно написать программу, реализующую аналог команды конвейера cat filename|sort. в программе нужно использовать pipe, fork, dup2, close,execve.
http://forum.codenet.ru/showthread.php?t=36480
Далее просто copy/paste :)
Если вкратце: создаёшь один канал в родителе, fork'аешь двух потомков. Отрубаешь ненужные тебе концы каналов. Перенаправляешь стандартный вывод первого потомка в писательный конец канала, а стандартный ввод второго в читательный конец канала. Далее exec'ом подменяешь образ соответствующего потомка образом соответствующей команды...
Далее просто copy/paste :)
Если вкратце: создаёшь один канал в родителе, fork'аешь двух потомков. Отрубаешь ненужные тебе концы каналов. Перенаправляешь стандартный вывод первого потомка в писательный конец канала, а стандартный ввод второго в читательный конец канала. Далее exec'ом подменяешь образ соответствующего потомка образом соответствующей команды...
Цитата:
Если вкратце: создаёшь один канал в родителе, fork'аешь двух потомков. Отрубаешь ненужные тебе концы каналов. Перенаправляешь стандартный вывод первого потомка в писательный конец канала, а стандартный ввод второго в читательный конец канала. Далее exec'ом подменяешь образ соответствующего потомка образом соответствующей команды...
Только один вопрос..........А зачем такие извращения если уже есть один PIPE '|' ???? Если ради познания, то в исходниках UNIX всё есть.
Это ещё не извращения :) Просто, как я понял, челу нужно было сэмулировать это дело - а тут чем ниже уроень абстракции, тем лучше... :)
В любой литре по программированию для Linux, описано создание неименнованного канала pipe.
Чтобы создать простой канал на Си, прибегают к использованию системного вызова pipe(). после создания канала, процесс обычно пораждает новый процесс.
Код:
Код:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
main()
{
int fd[2];
pipe(fd);
.
.
}
#include <unistd.h>
#include <sys/types.h>
main()
{
int fd[2];
pipe(fd);
.
.
}
После установки канала делается ответвление потомка:
Код:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
main()
{
int fd[2];
pid_t childpid;
pipe(fd);
if ((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}
.
.
}
#include <unistd.h>
#include <sys/types.h>
main()
{
int fd[2];
pid_t childpid;
pipe(fd);
if ((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}
.
.
}
Код:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
main()
{
int fd[2];
pid_t childpid;
pipe(fd);
if ((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}
if (childpid == 0)
{
/* Child process closes up input side of pipe */
close(fd[0]);
}
else
{
/* Parent process closes up output side of pipe */
close(fd[1]);
}
.
.
}
#include <unistd.h>
#include <sys/types.h>
main()
{
int fd[2];
pid_t childpid;
pipe(fd);
if ((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}
if (childpid == 0)
{
/* Child process closes up input side of pipe */
close(fd[0]);
}
else
{
/* Parent process closes up output side of pipe */
close(fd[1]);
}
.
.
}
Код:
/**************************************************************************
Excerpt from "Linux Programmer's Guide - Chapter 6"
(C)opyright 1994-1995.
**************************************************************************
MODULE: pipe.c
**************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(void)
{
int fd[2], nbytes;
pid_t childpid;
char string[] = "Hello, world!\n";
char readbuffer[80];
pipe(fd);
if ((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}
if (childpid == 0)
{
/* Child process closes up input side of pipe */
close(fd[0]);
/* Send "string" through the output side of pipe */
write(fd[1], string, strlen(string));
exit(0);
}
else
{
/* Parent process closes up output side of pipe */
close(fd[1]);
/* Read in a string from the pipe */
nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
printf("Received string: %s", readbuffer);
}
return(0);
}
Excerpt from "Linux Programmer's Guide - Chapter 6"
(C)opyright 1994-1995.
**************************************************************************
MODULE: pipe.c
**************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(void)
{
int fd[2], nbytes;
pid_t childpid;
char string[] = "Hello, world!\n";
char readbuffer[80];
pipe(fd);
if ((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}
if (childpid == 0)
{
/* Child process closes up input side of pipe */
close(fd[0]);
/* Send "string" through the output side of pipe */
write(fd[1], string, strlen(string));
exit(0);
}
else
{
/* Parent process closes up output side of pipe */
close(fd[1]);
/* Read in a string from the pipe */
nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
printf("Received string: %s", readbuffer);
}
return(0);
}
[/LEFT]