Я запутался в том, что я делаю неправильно, когда я пытаюсь вывести файл после того, как выполнил вторую программу.
Скажем, у меня есть входной файл со следующими именами:
Марти Б. Бич 7 8
Захарий б. Whitaker 12 23
Иван Санчес 02 15
Джим Toolonganame 9 03
После того, как мои программы закончатся, он преобразует имена учеников в их имена пользователей и выводит их в файл, подобный следующему:
mbb0708
zbw1223
is0215
jt0903
В настоящее время, когда моя программа стоит, она ничего не выводит в файл, и терминал, кажется, находится в бесконечном цикле, несмотря на то, что раньше я сам тестировал мою программу-конвертер и проверял, правильно ли она выводит имена в stdout.
Я не уверен, что я здесь делаю не так? Первое программирование с трубами. Я знаю, что нужно использовать команды чтения и записи для извлечения данных, но с помощью команды dup2 это необходимо только для одной команды чтения?
manager.c
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(int argc, char** argv)
{
pid_t pid;
int nbytes;
/*Buffer to hold data from pipe*/
char buffer[BUFSIZ + 1];
/*Pipe Information*/
int commpipe[2];
if(pipe(commpipe))
{
fprintf(stderr, "Pipe failed.\n");
return EXIT_FAILURE;
}
if((pid = fork()) == -1)
{
fprintf(stderr,"Fork error. Exiting.\n");
exit(1);
}
else if(pid == 0)
{
/*This is the child process. Close our copy of the write end of the file descriptor.*/
close(commpipe[1]);
/* Connect the read end of the pipe to standard input*/
dup2(commpipe[0], STDIN_FILENO);
/*Program will convert the Student's name to their respective names*/
execl("converter","converter",NULL);
/*Exit if failure appears*/
exit(EXIT_FAILURE);
}
else
{
FILE *file;
file = fopen("usernames.txt","a+"); //append a file(add text to a file or create a file it does not exist)
/*Close or copy of the read end of the file descriptor */
//close(commpipe[1]);
nbytes = write(commpipe[1], buffer, BUFSIZ);
//Read from pipe here first?
//Output to usernames.txt the usernames of the user from the pipe.
fprintf(file, "%s", buffer);
/*Wait for the child process to finish*/
waitpid(pid, NULL, 0);
}
return 0;
}