Перенаправление stdout для концов писать
Вопрос
Я пишу небольшую программу, а вот что он должен сделать.
В главном процессе я должен создать новый и что нужно выполнить другую программу, которая только делает Printf («текст»). Я хочу перенаправить конец записи трубы на STDOUT, и основной процесс должен читать из его трубы и и распечатать его на STDOUT. Я написал код, но снова и снова я получаю ошибку сегментации, когда родительский процесс пытается прочитать из трубы.
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
void write_to(FILE *f){
char buf[50];
fprintf(f,"KOMA");
}
int main(){
int cpPipe[2];
int child1_fd;
int child2_fd;
if(pipe(cpPipe) == -1){
fprintf(stderr,"ERROR PIPE creation");
exit(1);
}else{printf("pipe couldn't be created\n");}
child1_fd = fork();
if(child1_fd < 0){
fprintf(stderr, " CHILD creation error");
exit(1);
}
if(child1_fd == 0){
printf("*CHILD*\n");
char program[] = "./Damn";
int dupK;
printf("stdout %d \n", STDOUT_FILENO);
printf("stdin %d \n", STDIN_FILENO);
printf("pipe1 %d \n", cpPipe[1]);
printf("pipe0 %d \n", cpPipe[0]);
// closing pipe write
close(cpPipe[0]);
close(1);
dup(cpPipe[1]);
printf("and");
close(cpPipe[1]);
exit(0);
}else{
printf("*Parent*\n");
char *p;
char *buf;
FILE *pipe_read;
close(cpPipe[1]);
pipe_read = fdopen(cpPipe[0],"r");
while((buf = fgets(p,30,pipe_read)) != NULL){
printf("buf %s \n", buf);
}
wait();
printf("Child is done\n");
fclose(pipe_read);
exit(0);
}
}
Должен ли я закрыть конец трубы, когда я перенаправляю stdout к нему?
Решение
UHM, ... Причина вашей неисправности сегментации здесь:
buf = fgets(p,30,pipe_read);
P - указатель по сути некуда важно. Это контент - это то, что находится в стеке во время выполнения, вы никогда не инициализируете его. Вам нужно, чтобы указать на кусок памяти, которую вы можете использовать! Назначить возвращение malloc()
позвони к этому или заявляйте его как char p[LEN]
.
Редактировать: Вы также открываете уже открытые файловые дескрипторы. Проверьте документацию на fgets
и pipe
, Я думаю, что вы смущены как они работают.
Теперь, что сказано, поток вашей функции вроде сбивает с толку. Попробуйте работать над уточнением этого! Помните, что код предназначен для выражения намерений, идей функциональности. Попробуйте использовать карандаш и бумагу для организации вашей программы, а затем написать ее как настоящий код :).
Ваше здоровье!
Другие советы
Должен ли я закрыть конец трубы, когда я перенаправляю stdout к нему?
В общем, да, потому что, пока есть процесс с записью открытого конца трубы, процессы, чтение трубы не получит EOF и не будет зависать. Также приборствует, чтобы закрыть файловые дескрипторы, которые вы, конечно, не собираетесь использовать.
Ваш код также говорит, что «труба не может быть создана» в пути успеха.