将文件描述符的整数值写入文件

lec*_*rdo 3 c unix

只测试文件描述符.我的目标是用fopen打开一个文件流,并使用fprintf将文件描述符整数值写回文件,看看我得到了什么结果.

(我决定使用fopen,fprintf等)因为它允许我写变量,write()不允许它,

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

int main ()
{
  FILE *fp;

  fp = fopen("wow.txt", "w+");
  if (fp < 0)
    {
      printf("ERROR \n");
    }
  else
    {
      printf("we good \n");
    }

  fprintf(fp, "hi %p \n", fp);
}
Run Code Online (Sandbox Code Playgroud)

我面临的问题是,如果我为fprintf语句写了%d ...我得到编译器错误.如果我写%p,我得到RAM中的地址.

是否有可能获得绝对整数值...如"3"

pax*_*blo 5

FILE *fp;
Run Code Online (Sandbox Code Playgroud)

它不是文件描述符,它是文件流指针,因此,您需要将其视为指针.

一个文件描述符是一个小整数一个返回的UNIXy调用像open或者creat,当文件指针是上述那种水平,假设你在,即使环境是有描述.

在这些环境中,您通常可以使用以下内容获取基础描述符:

int fd = fileno (fp);
Run Code Online (Sandbox Code Playgroud)

以下完整程序(在CygWin下)显示了这一点:

#include <stdio.h>

int main (void) {
    FILE *fp = fopen ("wow.txt", "w+");
    if (fp < 0) {
        printf ("ERROR\n");
        return 1;
    }

    fprintf (fp, "fp=%p, fd=%d\n", fp, fileno (fp));
    fclose (fp);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

用以下内容编译:

gcc -o testprog testprog.c
Run Code Online (Sandbox Code Playgroud)

给出输出:

fp=0x800102a8, fd=3
Run Code Online (Sandbox Code Playgroud)