Я установил приложение, и его командная строка может делать:
command -input 1.txt
command < 1.txt
echo "hello" | command
и что-то вывести. У меня нет исходного кода, и я тоже хочу реализовать это поведение.
То, что я пробовал:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[]){
if ((fseek(stdin, 0, SEEK_END), ftell(stdin)) > 0){
rewind(stdin);
printf("stdin has data\n");
char buffer[100];
fgets(buffer, sizeof buffer, stdin);
printf("stdin data are: %s\n", buffer);
}else{
if (argc < 2){
printf("no cmd arguments\n");
return -1;
}else{
printf("command line argument: %s\n", argv[1]);
FILE* fp = fopen(argv[1], "r");
if (fp == NULL){
printf("NULL fp pointer\n");
return -1;
}
char a[100] = {0};
fgets(a, sizeof a, fp);
printf("first line of file: %s\n", a);
}
}
return 0;
}
Но проблема в том, что pipe не доступны Так что ((fseek(stdin, 0, SEEK_END), ftell(stdin)) > 0)
подходит не для всех случаев.
Одно из решений, о котором я думаю:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[]){
if (argc > 1){
//open file with argv[1] as filename
//read data from disk file
}else{
//read data from stdin
if(stdin is file){
//get file size
//read data from stdin
}else if(stdin is pipe){
//get pipe size
//read data from stdin
}
}
return 0;
}
У меня 2 проблемы с этим кодом:
Есть ли функция ispipe()
, которая работает как isatty(fileno(stdin))
? Мне нужно сказать, является ли stdin
pipe
.
Как мне получить stdin
размер / длину из трубы? Очевидно, я не могу использовать:
fseek(stdin, 0, SEEK_END);
long size = ftell(stdin));
Как отметил @Peter в комментарии, я не должен пытаться получить размер stdin из канала заранее, тогда как я узнаю это доходит до конца? Может ли кто-нибудь дать мне минимальный пример об этой «потоковой обработке»?