Re: Is fork() hook ever possible?



On Tue, Sep 16, 2008 at 11:36:03AM -0400, Daniel Eischen wrote:
On Tue, 16 Sep 2008, Andrey Chernov wrote:

On Tue, Sep 16, 2008 at 04:53:54PM +0200, Attilio Rao wrote:
2008/9/16, Andrey Chernov <ache@xxxxxxxxxxxx>:
On Tue, Sep 16, 2008 at 03:38:16PM +0100, Bob Bishop wrote:
Hi,


On 16 Sep 2008, at 15:03, Andrey Chernov wrote:

I need some sort of fork() hook to detect that pid is changed to re-
stir
ar4random() after that (in the child), simple flag variable with
child's pid is needed.

Currently OpenBSD does almost that checking getpid() every time
arc4random() called, but it is very slow way to use getpid() syscall
repeatedly, about 12-15 times slower than just arc4random() without
getpid().

Any ideas?


How about something hacky using mmap()/minherit()?

Could you please provide working low cost example to detect that we are in
the child (pid changed or something else)? Calling getpid() as OpenBSD
does definitely is very high cost. :(

An idea would be to implement a shared page between process and system
which exports such informations.
I'm sure we have a SoC project (2007) implementing this and perforce
branches for it, I'm just not sure how far it did end.

Please keep in mind that the hook itself must be invisible to user
application, we have standard API only - fork() and arc4random() family,
no additional setup or functions are possible outside of existen API. I.e.
the low cost hack must be completely inside ether the fork() wrapper or
arc4random().

Well, you could speed up getpid() by having libc wrap all fork()
variants. The idea is that getpid() would only call __sys_getpid()
the first time it was called and then only after a fork(). It
would return the saved process id for all other cases.

This wouldn't work if the application made its own syscall
without going through libc.

The shared page between process and system has been tossed around
before and would probably be more benficial. Having access to
time without making a syscall would be nice.

Yes, speeding up getpid() by caching its pid is nice idea.
But I am completely unaware how to create syscall wrappers inside libc. :(
I think about something like that:

__weak_reference(_fork, fork);

pid_t _fork(void);

pid_t
_fork(void)
{
pid_t ret;

if ((ret = __sys_fork()) == 0)
_curr_pid = -1;

return (ret);
}

But how it will coexists with the same __weak in thread/thr_fork.c ?
Are some threading locks required in this code?

--
http://ache.pp.ru/
_______________________________________________
freebsd-current@xxxxxxxxxxx mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscribe@xxxxxxxxxxx"



Relevant Pages

  • Re: Is fork() hook ever possible?
    ... >> child's pid is needed. ... but it is very slow way to use getpid() syscall ... application, we have standard API only - fork() and arc4randomfamily, ... This wouldn't work if the application made its own syscall ...
    (freebsd-current)
  • Re: 2 questions about signals
    ... apply, after the fork(), to both parent and child processes. ... I had been thinking that if one wanted to have the signal handler ... return value of getpid(). ...
    (comp.unix.programmer)
  • [patch 1/1] uml: use sys_getpid bypassing glibc (fixes UML on Gentoo)
    ... Using NPTL, getpid() sometimes delivers the wrong pid, since it uses the one ... int is_skas_winch ... printf("sigaltstack failed - errno = %d\n", ...
    (Linux-Kernel)
  • Re: Starting an external application from C++
    ... The getpid() system call returns both the current PID and the ... Basically the parent application is a client app which spawns the server, ... I'm not calling system(). ...
    (comp.unix.programmer)
  • Re: clone() <-> getpid() bug in 2.6?
    ... So yes, you'll find some broken benchmarks using getpid(), but nobody sane ... thread-specific pid to look up the thread-specific data. ... send the line "unsubscribe linux-kernel" in ...
    (Linux-Kernel)