Я хочу сделать простую программу, которая вилка, и ребенок записывает в именованный канал, а родительский читает и отображает из именованного канала. Проблема в том, что он входит в родительский, делает первый printf, а затем становится странным, он ничего не делает, не попадает во второй printf, это просто способы ввода в консоль.C Именованная труба (fifo). Родительский процесс застрял
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void main()
{
char t[100];
mkfifo("myfifo",777);
pid_t pid;
pid = fork();
if (pid==0)
{
//execl("fifo2","fifo2",(char*)0);
char r[100];
printf("scrie2->");
scanf("%s",r);
int fp;
fp = open("myfifo",O_WRONLY);
write(fp,r,99);
close(fp);
printf("exit kid \n");
exit(0);
} else
{
wait(0);
printf("entered parent \n"); // <- this it prints
// whats below this line apparently its not being executed
int fz; printf("1");
fz = open("myfifo",O_RDONLY); printf("2");
printf("fd: %d",fz);
char p[100];
int size;
printf("------");
//struct stat *info;
//stat("myfifo",info); printf("%d",(*info).st_size);
read(fz,p,99);
close(fz);
printf("%s",p);
printf("exit"); exit(0);
}
}
Я открываю FIFO, но я закрываю его в том же процессе. поэтому он не должен блокироваться. и я НЕОБХОДИМО, что мой родительский процесс ждет после своего дочернего элемента, потому что ребенок получает вход, и я не могу не ждать в первой строке родителя, потому что это означало бы начать читать из fifo, когда я даже не закончил написать на нем – Blitzkr1eg
сейчас у меня: char c [2]; c [1] = 0; с [0] = 0; c [0] = strlen (r); // c [0] позволяет сказать 4 write (fp, c, 1); // fp - это FIFO , а затем в другом процессе: // открываем трубку, проверяем наличие ошибок, но ошибок нет, поэтому открываем штраф char c [2]; с [1] = 0; с [0] = 0; читать (fz, c, 1); // fz - это труба // и теперь c [0] - это 0, а не то, что должно быть, 4 – Blitzkr1eg
Это может быть трудно после изменений кода, описанных в комментариях. Вам лучше редактировать свой вопрос, чтобы показать, что вы пробовали. Я добавил пример моего ответа, который должен помочь вам. – jschmier