[erlang-questions] where is os:getuid() ?
zxq9
zxq9@REDACTED
Tue Nov 24 09:26:19 CET 2015
On Tuesday 24 November 2015 08:52:36 Daniel Abrahamsson wrote:
> Rather than to try to find a generic interface for something that is
> inherently OS specific, perhaps it would be better to create a "posix"
> module that exports some common posix operations. That way it is obvious to
> whoever use it that you can't expect it to work on non-posix OSes.
That is certainly one possibility. Which feels more inconvenient?
do_some_os_thing() ->
perform_os_action(os:type())
perform_os_action({unix, _}) ->
{ok, NodeUid} = posix:getuid(),
do_action(posix, NodeUid);
perform_os_action({win, _}) ->
{ok, NodeUid} = windows:getuid(),
do_action(win, NodeUid);
% ...
do_action(posix, NodeUid) ->
% stuff...;
do_action(win, NodeUid) ->
% slightly different stuff...;
% ...
OR
do_some_os_thing() ->
perform_os_action(os:getuid())
perform_os_action({{unix, _}, NodeUid}) ->
% stuff... ;
perform_os_action({{win, _}, NodeUid}) ->
% slightly different stuff...;
% ...
OR
do_some_os_thing() ->
% Inventing an os:get_feature_module/1 here...
OSType = os:type(),
OSMod = os:get_feature_module(OSType)
{ok, NodeUid} = OSMod:getuid(),
perform_os_action(OSType, NodeUid)
%% etc...
I can't really see a clear balance of pros and cons either way -- the
difference will *probably* have to be tackled head-on in the related code
eventually, at least if that code is intended to work across platforms.
I'm not sure that an OS-specific module will do much to make the calling
code less annoying to write -- though it may make building ERTS against a
given platform easier (you only need the module relevant to the target
platform -- but I think this has to happen in any case underneath?). What
I do at the moment is match on the result of os:type/0, and execute an
os-specific script or command (shell, batchfile, some natively built code,
whatever).
As you say, one real benefit of making a 'posix', 'windows', etc. modules
would be that determining exactly what features are supported on a given
platform becomes as simple as checking the docs for that platform's module.
That's better than having a generic interface that only works the same way
on most but not all platforms. (I *really* hate hunting through docs for
caveats like "super_important_function/3 only works on platform X; does
nothing and returns 'ok' on Y"). On the other hand, checking for API
compatibility would then require looking through each platform module to
make sure you didn't miss anything. :-/
Any thoughts? I write a fair amount of cross-platform code in Erlang these
days. This sort of thing is so annoying that I will do cheetah flips to
avoid the weird places where os differences start mattering (if the need is
non-trivial I'll write entirely separate native programs I can call from
Erlang). Fortunately cases where this can't be avoided are rare.
-Craig
More information about the erlang-questions
mailing list