[英]Bad file descriptor error when trying to associate fmemopen file descriptor with stdin
我試圖插入最初從stdin
讀取的fscanf
函數,例如fscanf(stdin,"%ms", &secret)
。 在我插入的函數中,我試圖使其從使用字符串創建的輸入文件中讀取。 以下是我在做什么:
int fscanf(FILE *stream, const char *format, ...){
FILE * in ;
char * buffer = "secretString";
size_t length = strlen(buffer);
in = fmemopen(buffer, length, "r");
if (in== NULL){
handle_error("fmemopen");}
// This is the part where I'm trying to feed my file as stdin
// since original fscanf expects stdin which I'm trying to hack
int dptr = fileno(in);
dup2(dptr, 0);
va_list args;
va_start(args, format);
int p = vfscanf(in, format, args);
va_end(ap);
fclose(in);
return p;
}
但是,我收到了Bad file descriptor
錯誤。 如果有人可以告訴我我在做什么錯,我將不勝感激。
我不清楚您從哪里想到應該嘗試像這樣替換stdin的文件描述符。 它不能那樣工作,因為fmemopen
的全部要點是它后面沒有底層文件(因此也沒有文件描述符)。 它只是內存緩沖區對stdio API的改編。
幸運的是,我認為沒有理由需要或不想重新映射文件描述符以執行所需的操作。 如果要攔截fscanf
並使用其他FILE*
參數重新調用vfscanf
,則不會使用stdin
,因此對其進行的任何更改均無效。
fmemopen(3)寫道:
筆記
沒有與此函數返回的文件流關聯的文件描述符(即,如果在返回的流上調用,fileno(3)將返回錯誤)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.