Да, но у вас есть несколько небольших проблем в ваших программах. в первом:
write(fd, str, strlen(str)+1);
немного нетрадиционно. Это отправляет строку плюс ее разделитель конца строки (\ 0) в fd. Обычно это не делается со строками, strlen (str), вероятно, то, что вы хотите.
во втором:
fp1 = fopen(filename,"r");
fp2 = fopen(filename,"w");
имени файла не было присвоено значение, поэтому оба изэти открытия почти наверняка потерпят неудачу. Когда они это делают, они возвращают NULL-указатель, поэтому первая попытка использовать их:
while (! Feof (fp1))
, скорее всего, вызовет нарушение сегмента. Кроме того, вы в любом случае не используете fp1, поэтому, если feof (fp1) вернул 1, он всегда вернет 1. Вы хотите, чтобы этот цикл основывался на исчерпании fifo, что означает, что в нем нет данных, и никто не имеетэто открыто для записи. Таким образом, немного изменив эту программу, вы получите:
#include<stdio.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
int fd1;
char *myfifo ="/tmp/myfifo";
char str1[80];
ssize_t n;
fd1= open(myfifo, O_RDONLY);
while ((n=read(fd1,str1,sizeof str1)) > 0)
{
fwrite(str1, 1, n, stdout);
}
return 0;
}
Хотя этот набор изменений работает, он не решает другой вопрос об использовании функций stdio с конвейерами. Ответ - да, и вот еще одна функциональная перезапись вашей второй программы:
#include<stdio.h>
int main()
{
char *myfifo ="/tmp/myfifo";
FILE *fp;
int c;
if ((fp = fopen(myfifo, "r")) != NULL) {
while ((c = getc(fp)) != EOF) {
putchar(c);
}
fclose(fp);
}
return 0;
}
Кроме того, в первом критический бит с stdio:
...
FILE *fi = fopen(myfifo, "a");
while(fgets(str,80,fp)!=NULL)
{
fputs(str, fi);
}
fclose(fi);
...
, как во второй, цикл мог быть реализован с помощью getc, putc. Общее уточнение может быть такими функциями:
ssize_t FCopy(FILE *in, FILE *out) {
int c;
ssize_t len = 0;
while ((c = getc(in)) != EOF) {
len++;
if (putc(c, out) != c) {
return -len;
}
}
return len;
}
ssize_t FileAppend(char *from, char *to) {
FILE *in, *out;
ssize_t n = 0;
if ((in = fopen(from, "rb")) != NULL) {
if ((out = fopen(to, "ab")) != NULL) {
n = FCopy(in, out);
fclose(out);
} else {
n = -1;
}
fclose(in);
} else {
n = -1;
}
return n;
}
, поэтому ваш основной файл будет выглядеть примерно так:
...
char filename[80];
printf("Enter a file to store the data in: ");
if (fgets(filename, sizeof filename, stdin)) {
filename[strlen(filename)-1] = '\0';
if (FileAppend(myfifo, filename) < 0) {
printf("Error: could not save data to %s\n", filename);
}
}
....