Как использовать канал между различными программами?

60
10

Вопрос снова задан, а код изменен...

Мне нужно создать три программы с именем program0 program1 и program2 в linux.

Program0: Создает родителя с двумя дочерними процессами и выполняет программу 1, а программа 2 со своими дочерними элементами ждет их завершения и закрытия.

Program1: принимает имя файла от пользователя и записывает текст в файл. Он заканчивает запись при нажатии CTNL + D и создает канал. После этого с помощью команды cat он записывает файл в stdout и использует dup() для создания канала, который имеет файл в нем.

Program2: он считывает имя файла из канала с помощью dup(), а затем выполняет команду wc.

До сих пор мне удалось создать все программы, и у меня нет компиляции ошибок. Программа 0 выполняет обе программы. Программа 1 также работает и отправляет файл в трубу, но программа2 не может прочитать ее из канала, печатает странные символы.

Когда я пытаюсь читать из канала внутри программы1, он работает (см. Деактивированный код в программе 1), но тот же код не работает, если я помещаю его внутри программы2.

Итак, как я могу заставить program2 читать из этого канала после этого, я попытаюсь выполнить команду wc в program2, но сначала я должен уметь видеть, что он принимает входной файл из stdout так, как?

Я знаю его долгое время, но, пожалуйста, помогите мне, ребята...

Программа 0

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#define MAX 999

int main()
{
pid_t pid1, pid2;

pid1 = fork();
if(pid1<0)
{
fprintf(stderr,"Fork basarisiz");
exit(-1);
}
else if (pid1 ==0)/*child prosesleri*/
{

printf("program1\n");

execlp("./program1","program1",NULL);
execlp("./program2","program2",NULL);
}
else /*parent procsesleri */
{
wait(NULL);
pid2 = fork();
if(pid2<0)
{
fprintf(stderr,"Fork basarisiz");
exit(-1);
}
else if (pid2 ==0)/*child prosesleri*/
{
printf("\n");
printf("Program 2\n");
printf("\n");
execlp("./program2","program2",NULL);
//printf("\n");
}
else
{
}

/////////////////////////////////////////////////////////////////////////
wait(NULL);
printf("\n");
printf("Parent:Two child processes have successfully been created\n");
printf("Parent:Two child processes have successfully been terminated\n");
printf("Parent:This process will now terminate\n");
printf("\n");
exit(0);
}
}

Программа 1

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define MAX 999

int main()
{
char c[10000];
char file[10000];
int words;
printf("Child1:A text file will be created\n");
printf("Child1:Enter the name of the file\n");
scanf("%123s",file);
strcat(file,".txt");
FILE * pf;
pf = fopen(file, "w" );

if (!pf)
fprintf( stderr, "I couldn't open the file.\n" );

else
{
printf("Child1: Input a number of text lines ended, each ended by a CR (carriage return).\n");

/////////////////////////////

do
{
if (NULL != fgets(c, sizeof(c), stdin))
{
if (0 == strcmp(c, ".\n"))
{
break;
}

fprintf(pf, "%s", c);
}
else
{
if (0 != ferror(stdin))
{
fprintf(stderr, "An error occured while reading from stdin\n");
}
else
{
printf("Child1: Finish the input by CNTL^D\n");
}

break;
}
} while (1);

/////////////////////////////

}
printf("\nChild1:The file %s is succesfully created and saved in the current dictionary\n",file);

//////////////////////////////////////////////

/////////////////////////pipe///////////////

fclose(pf); // close file

char ch;
int outcount = 0;
int fd[2], nbytes;
pid_t childpid;
int i;
char f2[2];

char readbuffer[80];

pipe(fd);

if((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}

if(childpid == 0)

{ printf("\nChild1:The file written to pipe with cat\n");
close(1) ;
dup(fd[1]);
close(fd[0]);
execlp("/bin/cat", "cat", file,NULL);

}
else
{
wait(NULL);
//close(0) ;
//dup(fd[0]) ;
//close(fd[1]);
//nbytes = read(fd[0], readbuffer, sizeof(readbuffer));

//printf("%s\n",readbuffer);
}

return(0);
}

Программа 2

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
int fd[2],nbytes;
pid_t childpid;
char readbuffer[80];

pipe(fd);

if((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}

if(childpid == 0)
{
}
else
{
close(0) ;
dup(fd[0]) ;
close(fd[1]);
nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
printf("%s\n",readbuffer);

}

return(0);
}

спросил(а) 2013-11-26T00:48:00+04:00 6 лет, 10 месяцев назад
1
Решение
57

Вы можете проверить страницы man для execve (2) (для запуска cat) и dup2 (2) (для переопределения stdin и stdout при необходимости) для этого. execve перезапишет исполняемую в настоящее время программу другой (такой же PID, те же файловые дескрипторы), в то время как dup2 позволит вам переопределить любой стандартный дескриптор файла, чтобы указать на любой файловый дескриптор, который вы ему предоставляете (например, любой из концы вашей трубы).

ответил(а) 2013-11-26T01:15:00+04:00 6 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема