Ada95调用C_Mkstemp()

Ada95调用C_Mkstemp(),ada,ada95,Ada,Ada95,获取临时文件名的代码返回的是空字符串。我正在试图弄清楚它是如何工作的,因为我在mkstemp上找到的所有文档都说它需要一种类似/tmp/prefixxxxxx的格式,而这里没有使用这种格式 function get_Temp_Name return String is Temp_File_Name : String (1 .. 25) := (others => ' '); C_Buffer : aliased Interfaces.C.Char_Array

获取临时文件名的代码返回的是空字符串。我正在试图弄清楚它是如何工作的,因为我在
mkstemp
上找到的所有文档都说它需要一种类似
/tmp/prefixxxxxx
的格式,而这里没有使用这种格式

function get_Temp_Name
    return String
is

  Temp_File_Name : String (1 .. 25) := (others => ' ');

  C_Buffer      : aliased  Interfaces.C.Char_Array          := Interfaces.C.To_C(Temp_File_Name, Append_Nul => True);
  C_Ptr         : constant Interfaces.C.Strings.Chars_Ptr   := Interfaces.C.Strings.To_Chars_Ptr(C_Buffer'Unchecked_Access);
  Result_Ptr    : Interfaces.C.Strings.Chars_Ptr;

begin
    Result_Ptr := C_Mkstemp(C_Ptr);             
    return Ada.Strings.Fixed.Trim(Interfaces.C.To_Ada(C_Buffer, True), Ada.Strings.Both);

    EXCEPTION
        when Error : others =>
            -- redacted
            raise;

end Get_Temp_Name;
这是一种古老的通话方式吗

目录权限会影响
C_Mkstemp()
的执行吗

编辑:定义/导入
C_Mkstemp

  function C_Mkstemp( template : Interfaces.C.Strings.Chars_Ptr )
      return Interfaces.C.Strings.Chars_Ptr;
      pragma Import(C, C_Mkstemp, "mkstemp");

如果您想在Ada中创建临时文件,只需使用带有空文件名的Create。这并不是回答您的实际问题,但您可以通过在Ada.Text\u IO.Create(或其他*\u IO包)中保留name参数为空来创建临时文件。
mkstemp()
返回为读写而打开的文件描述符
mktemp()
返回一个
char*
,这是您的代码所假定的。@Kingsley:作为参考,标准说,“Name的空字符串指定了一个在主程序完成后无法访问的外部文件(临时文件)。”这是否满足您的要求?@Kingsley:如果您使用的是GNAT,标准的临时文件使用mkstemp(我只是复制粘贴目标名称):linux、FreeBSD、NetBSD、OpenBSD、GLIBC、ANDROID、DragonFly、QNX。如果Ada编译器提供的临时文件名不是唯一且线程安全的,这肯定是一个错误。如果您想在Ada中创建临时文件,只需使用带有空文件名的Create。这并没有回答您的实际问题,但您可以通过在Ada.Text_IO.Create(或其他*_IO包)
mkstemp()中保留name参数为空来创建临时文件
返回为读写而打开的文件描述符
mktemp()
返回一个
char*
,这是您的代码所假定的。@Kingsley:作为参考,标准说,“Name的空字符串指定了一个在主程序完成后无法访问的外部文件(临时文件)。”这是否满足您的要求?@Kingsley:如果您使用的是GNAT,标准的临时文件使用mkstemp(我只是复制粘贴目标名称):linux、FreeBSD、NetBSD、OpenBSD、GLIBC、ANDROID、DragonFly、QNX。如果Ada编译器提供的临时文件名不唯一且线程不安全,那么它肯定是一个bug。