如何启动进程并将其 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_Id
,OS_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 中 运行 execv
和 fork
的例子。
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 的一个实例。
我正在为 Linux 用 Ada 编写一个流程管理器。我正在使用 GNAT.OS_Lib
生成进程:
Pid := GNAT.OS_Lib.Non_Blocking_Spawn(
Program_Name => Program,
Args => Arguments
);
这让我返回 PID 作为 Process_Id
,OS_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 中 运行 execv
和 fork
的例子。
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 的一个实例。