大神们可知为何以下linux程序代码中fileno()获取fpout的文件描述符时返回-1错误吗?打印fd总是-1,fpout是fmemopen()打开的内存流文件指针,莫非fileno()就是不能获取fmemopen()内存流式文件的文件描述符?#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
int fd;
int err_no;
FILE *fpout;
char buffer[256];
char buf[2048];
char *buf1;
char *cmd = "cat /proc/meminfo";
buf1 = "This is testing for fputs...\n";
int i = 0;
for(i=0; i < 29; i++){
buf[i] = buf1[i];
}
printf("cmd is: %s\n", cmd);
fpout = fmemopen(buf, 2048, "a+");
fd = fileno(fpout);
printf("fpout pointer value is: %d\n", fpout);
err_no = fprintf(fpout, "This is testing for fputs...\n");
printf("fprintf return value is: %d\n", err_no); fseek(fpout, 0, SEEK_SET);
fgets(buffer, 255, fpout);
printf("get string is: %s\n", buffer );
memset(buffer, 0, 256);
printf("fd no. is: %d\n", fd);
printf("stdout no. is: %d\n", fileno(stdout));
dup2(fd,1);
printf("after dup2, fd no. is: %d\n", fd);
printf("after dup2, stdout no. is: %d\n", fileno(stdout));
system(cmd);
while (fgets(buffer, sizeof(buffer), fpout)) {
printf("%s", buffer);
}
fclose(fpout);
return 0;
}
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
int fd;
int err_no;
FILE *fpout;
char buffer[256];
char buf[2048];
char *buf1;
char *cmd = "cat /proc/meminfo";
buf1 = "This is testing for fputs...\n";
int i = 0;
for(i=0; i < 29; i++){
buf[i] = buf1[i];
}
printf("cmd is: %s\n", cmd);
fpout = fmemopen(buf, 2048, "a+");
fd = fileno(fpout);
printf("fpout pointer value is: %d\n", fpout);
err_no = fprintf(fpout, "This is testing for fputs...\n");
printf("fprintf return value is: %d\n", err_no); fseek(fpout, 0, SEEK_SET);
fgets(buffer, 255, fpout);
printf("get string is: %s\n", buffer );
memset(buffer, 0, 256);
printf("fd no. is: %d\n", fd);
printf("stdout no. is: %d\n", fileno(stdout));
dup2(fd,1);
printf("after dup2, fd no. is: %d\n", fd);
printf("after dup2, stdout no. is: %d\n", fileno(stdout));
system(cmd);
while (fgets(buffer, sizeof(buffer), fpout)) {
printf("%s", buffer);
}
fclose(fpout);
return 0;
}
并且 fmemopen 是应用层函数,应该没有对应的 系统调用,没有系统调用的话和内核没多大关系,当然没有文件描述符