如何启动进程并将其 PID to/from 转换为整数?

How can I start a process and convert its PID to/from an integer?

我正在为 Linux 用 Ada 编写一个流程管理器。我正在使用 GNAT.OS_Lib 生成进程:

Pid := GNAT.OS_Lib.Non_Blocking_Spawn(
    Program_Name => Program,
    Args => Arguments
);

这让我返回 PID 作为 Process_IdOS_Lib 私有类型。我希望能够将此 PID 作为整数 存储在文件中 ,以便与其他非 Ada 代码兼容,然后稍后从该文件重新加载并使用它从 Ada 内部终止进程,检查其状态等。

OS_Lib 提供了一个 Pid_To_Integer 函数,但没有反函数。

也许我需要一个不同的库?据我所知,当前没有 Ada POSIX 库。我应该自己写一个吗?我只需要支持三个 POSIX 调用。我愿意接受所有建议。

通过 RTS 寻找定义,g-os_lib.ads

with System.OS_Lib;

package GNAT.OS_Lib renames System.OS_Lib;

s-os_lib.ads 的底部我们发现

type Process_Id is new Integer;

所以我会选择 Ada.Unchecked_Conversion

最后,我写了自己的实现。这是一个如何在 Ada 中 运行 execvfork 的例子。

main.adb

with Ada.Text_IO;
with Interfaces.C.Strings;

procedure Main is
    subtype C_String is Interfaces.C.Strings.chars_ptr;
    Null_String: C_String := Interfaces.C.Strings.Null_Ptr;

    function As_C_String(s: String) return C_String renames Interfaces.C.Strings.New_String;

    type Argument_List is Array(1..2) of C_String;

    function Execute(Program: C_String; Arguments: Argument_List) return Integer
        with Import => True, Convention => C, External_Name => "execv";
    function Fork return Integer
        with Import => True, Convention => C, External_Name => "fork";

    Program: C_String := As_C_String("/bin/sh");
    Args: Argument_List := (Program, Null_String);

    N : Integer;
    Pid: Integer;
begin
    Pid := Fork;
    if Pid = 0
    then
        N := Execute(Program, Args);
    else
        Ada.Text_IO.Put_Line(Pid'Image);
    end if;
end Main;

main.gpr

project Main is

   for Languages use ("ada");

   for Source_Dirs use (".");
   for Main use ("main.adb");
   for Object_Dir use "obj";
   for Exec_Dir use ".";

end Main;

gprbuild 编译,它工作正常。 运行 main 并且您应该在控制台中看到一个整数 运行 ps ux 并且您应该看到 sh 运行 该 PID 的一个实例。