Tuesday, February 17, 2015

Writing signal-aware waitpid in Perl

As I have talked in YAPC::Asia couple of years ago, the wait functions (e.g. wait, waitpid) of Perl do not return EINTR when receiving a signal.

This is a problem if you would want to wait for child processes until receiving a signal. Proc::Wait3 can be a solution, however the module may be hard to install as it is an XS module. It should also be noted that the module provides replacement for wait only; no workaround exists for waitpid.

So today I have scrubbed my head wondering if I could come up with a pure-perl solution, and, here it is. The Perl script below launches a worker process (that just sleeps), and waits for the process to complete, or until SIGTERM is being received.

use strict;
use warnings;
use Errno ();

our $got_sigterm = 0;
our $sighandler_should_die = 0;

# fork a child process that does the task
my $child_pid = fork;
die "fork failed:$!"
    unless defined $child_pid;
if ($child_pid == 0) {
    # in child process, do something...
    sleep 100;
    exit 0;
}

$SIG{TERM} = sub {
    $got_sigterm = 1;
    die "dying to exit from waitpid"
        if $sighandler_should_die;
};

warn "master process:$$, child process:$child_pid";

# parent process, wait for child exit or SIGTERM
while (! $got_sigterm) {
    if (my_waitpid($child_pid, 0) == $child_pid) {
        # exit the loop if child died
        warn "child process exitted";
        $child_pid = -1;
        last;
    }
}

if ($child_pid != -1) {
    warn "got SIGTERM, stopping the child";
    kill 'TERM', $child_pid;
    while (waitpid($child_pid, 0) != $child_pid) {
    }
}

sub my_waitpid {
    my @args = @_;
    local $@;
    my $ret = eval {
        local $sighandler_should_die = 1;
        die "exit from eval"
            if $got_sigterm;
        waitpid($args[0], $args[1]);
    };
    if ($@) {
        $ret = -1;
        $! = Errno::EINTR;
    }
    return $ret;
} 

The trick is that waitpid is surrounded by a eval within the my_waitpid function, and the signal handler calls die to exit the eval if the $sighandler_should_die flag is being set. It is also essential to check the $got_sigterm flag within the eval block after setting the $sighandler_should_die flag, since otherwise there would be a race condition.

By using these tricks it has now become possible to implement process managers in pure-perl!

32 comments:

  1. دار السلام اهم شركة نقل عفش بالطائف وكذلك اهم شركة نقل عفش بمكة وجدة والمدينة المنورة تقوم الشركة بنقل العفش بحفر الباطن وتبوك وجازان وتقوم بنقل الاثاث بالقصيم
    شركة نقل عفش بالطائف
    شركة نقل عفش بالمدينة المنورة
    شركة نقل عفش بجازان وابها

    ReplyDelete

  2. افضل شركة نقل عفش بجدة شركة الاطلال شركة نقل اثاث بجدة شركة متخصصة فى نقل اثاث بجدة على اعلى مستوى من نقل العفش بجدة
    شركة نقل عفش بجدة

    ReplyDelete

  3. شركة نقل عفش
    اهم شركات مكافحة حشرات بالخبر كذلك معرض اهم شركة مكافحة حشرات بالدمام والخبر والجبيل والخبر والاحساء والقطيف كذلك شركة رش حشرات بالدمام ومكافحة الحشرات بالخبر
    شركة مكافحة حشرات بالدمام
    شركة تنظيف خزانات بجدة الجوهرة من افضل شركات تنظيف الخزانات بجدة حيث ان تنظيف خزانات بجدة يحتاج الى مهارة فى كيفية غسيل وتنظيف الخزانات الكبيرة والصغيرة بجدة على ايدى متخصصين فى تنظيف الخزانات بجدة
    شركة تنظيف خزانات بجدة
    شركة كشف تسربات المياه بالدمام
    شركة نقل عفش واثاث

    ReplyDelete
  4. Install full MICROSOFT office setup 365 with our support. Now setting up your account will be a cakewalk with us.

    Setup and Install Office 2017/2018 365 on your Mac/PC with genuine OFFICE PRODUCT key.
    Word, Excel, PowerPoint, Outlook, OneNote and OneDrive, on your PC,Publisher and Access.Everything you need for home, education and work.
    We are providing independent support service if in case you face problem to activate or SETUP OFFICE product.

    Regards - www.office.com/setup

    ReplyDelete
  5. Very nice post. I just stumbled up?n your weblog and wished to say that I have really enjoyed browsing ?our blog posts.
    Regards - www.office.com/setup

    ReplyDelete
  6. I am happy to be here and this wonderful article. I have found here lots of interesting information for my knowledge I need. all the details you provide to us, it was very helpful and useful, thanks for sharing this post.

    khasiat obat herbal
    Obat penyakit kulit
    cara mengilangkan benjolan
    toko obat herbal sapnudin
    sehat dan cantik alami
    cara menghilangkan benjolan di selangkangan

    ReplyDelete
  7. I can only express a word of thanks. Because with the content on this blog I can add knowledge I, thank has been sharing this information. Do not forget to visit our website to share information and knowledge about health.|
    Cara mengobati Nyeri Belikat |
    Cara Mengatasi Mata Kaki Bengkak |
    obat herbal jantung koroner

    ReplyDelete
  8. I can only express a word of thanks. Because with the content on this blog I can add knowledge I, thank has been sharing this information. Do not forget to visit our website to share information and knowledge about health.|
    Cara Mengobati penyakit kanre pali |
    Obat Filariasis Herbal |

    ReplyDelete
  9. Subhanallah, this is a very good article. Give me awareness. Because all this time I always had a lot of good intentions, but after I got the things I could share.

    Cara Menghilangkan Nyeri Dan Pegal Di Lutut
    Tips Menyembuhkan Patah Tulang
    Obat Kanker Payudara

    ReplyDelete
  10. I can only express a word of thanks. Because with the content on this blog I can add knowledge I, thank has been sharing this information. Do not forget to visit our website to share information and knowledge about health. |
    cara mengatasi radang panggul |
    obat infeksi saluran kemih |
    obat herbal infeksi usus |
    sapnudin herbal |
    obat pusing kliyengan |
    nama obat diare pada anak

    ReplyDelete
  11. I can only express a word of thanks. Because with the content on this blog I can add knowledge I, thank has been sharing this information. Do not forget to visit our website to share information and knowledge about health. |
    cara mengatasi radang panggul |
    obat infeksi saluran kemih |
    obat herbal infeksi usus |
    sapnudin herbal |
    obat pusing kliyengan |
    nama obat diare pada anak

    ReplyDelete
  12. Subhanallah, this is a very good article. Give me awareness. Because all this time I always had a lot of good intentions, but after I got the things I could share.

    Cara Menghilangkan Nyeri Dan Pegal Di Lutut Cara Mengatasi Emfisema Obat Hipertiroid Cara Mengatasi Tinnitus Obat Amandel Paling Ampuh

    ReplyDelete
  13. Given article is very helpful and very useful for my admin, and pardon me permission to share articles here hopefully helped :

    Obat kesrek tradisional
    Cara menyembuhkan batuk rejan
    Cara Menghilangkan Benjolan Di Kepala

    ReplyDelete
  14. Webroot.com/safe is a protection software solution that communicates with the cloud avoiding the hassle to manage the signature updates to deploy. for office setup visit office.com/setup

    ReplyDelete
  15. This is a very great post and the way you express your all post details that is too good. Thanks for sharing with us this useful post :

    pengobatan cacar air
    manfaat sari kurma
    cara mengobati batu empedu

    ReplyDelete
  16. Nice to be visiting your blog again, it has been months for me. Well this article that i’ve been waited for so long. I need this article to complete my assignment in the college, and it has same topic with your article. Thanks, great share :


    cara mengobati kencing manis
    cara mengobati gondok secara alami

    ReplyDelete
  17. What a way to express things. I have found comfort in reading this post and i am sure other users may feel the same, because this post carries a social message in it. Keep it up ! Regards:-
    office.com/setup | norton.com/setup | mcafee.com/activate

    ReplyDelete
  18. Thanks for posting this info. I just want to let you know that I just check out your site and I find it very interesting and informative.

    mcafee.com/activate|
    mcafee.com/activate|
    mcafee.com/activate|
    mcafee.com/activate|
    norton.com/setup|
    mcafee.com/activate

    ReplyDelete