Existem dois erros no seu código:
-
write(…, sizeof(char));
só grava "sizeof (char)" bytes (= provavelmente 1 ou 2 bytes) no FIFO, e não o tamanho do buffer como você provavelmente pretendia -
my_fifo |
não lerá nenhum dado do FIFO; você precisarácat
pelo menos.
Como a chamada para write
será bloqueada até que o script leia os dados (e vice-versa!), sugiro colocar a operação de gravação e a execução do script em dois processos ou encadeamentos diferentes (há outras possibilidades como bem, por exemplo, escrever sem bloqueio, tudo depende do seu design pretendido). O exemplo a seguir demonstra o princípio, usando a chamada do sistema fork
para simplificar:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <assert.h>
#define FIFO_NAME "./my_fifo"
int main() {
int res, fifo, pid;
char *str = "Hello World!\n";
/* Fork this process into a reader and a writer */
fprintf(stderr, "Forking process\n");
pid = fork();
assert(pid >= 0);
if (pid == 0) {
/* The reader calls a shell script supposed to read the data from the FIFO */
printf("Starting shell script\n");
system("./tst.sh");
}
else {
/* Create FIFO */
fprintf(stderr, "Creating FIFO\n");
remove(FIFO_NAME);
res = mkfifo(FIFO_NAME, 0777);
assert(res == 0);
/* Open FIFO */
fprintf(stderr, "Opening FIFO\n");
fifo = open(FIFO_NAME, O_WRONLY);
assert(fifo != 0);
/* The writer opens the FIFO and writes some data to it */
printf("Writing to FIFO\n");
res = write(fifo, str, strlen(str));
assert(res > 0);
close(fifo);
}
}
E o script de shell tst.sh
contém:
#!/bin/sh
echo "Started shell script"
cat ./my_fifo
A saída do programa C é:
Forking process
Creating FIFO
Opening FIFO
Starting shell script
Started shell script
Writing to FIFO
Hello World!