using filedescriptors in SIGINT signal handler

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Bram Stolk

    #1

    using filedescriptors in SIGINT signal handler

    Hello,

    I catch SIGINT signals with a handler.
    In the handler, I use fd's to write some data to a child process.

    Is this valid?
    Because the data never arrives, and I wonder what I'm doing wrong.

    Can filedescriptors still be used when you're in the signal
    handling of SIGINT?

    Thanks,

    Bram
  • jepler@unpythonic.net

    #2
    Re: using filedescriptors in SIGINT signal handler

    If you're talking about a Python function registered as a handler by
    signal.signal, then there should not be any restrictions on what you do
    in that function.

    Here's a small program I wrote:
    #------------------------------------------------------------------------
    import os, signal, time

    def h(*args): os.write(fd, "data\n");

    print "my pid is", os.getpid()
    subproc = os.popen("cat -n", "w")
    fd = subproc.fileno( )

    signal.signal(s ignal.SIGINT, h)

    while 1:
    time.sleep(1)
    #------------------------------------------------------------------------

    I ran this and in another terminal I repeatedly typed 'kill -INT nnnn',
    where nnnn is the pid printed by my program. Each time, another line is
    output by 'cat'.

    When I try to deliver the signal by hitting ctrl-c in that terminal, the
    first time nothing happens and the second time I get the message
    OSError: [Errno 32] Broken pipe
    in this case, I believe that the first signal was delivered to cat,
    causing it to exit. The second signal was delivered to the python
    program, which obviously couldn't write to the stdin of a process that
    had exited.

    Jeff

    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.2.6 (GNU/Linux)

    iD8DBQFDJs39Jd0 1MZaTXX0RApghAJ 9SRtNridVQTj2qk u5aViuW+eM5jQCg q80q
    c45b9r6vdrNHcbW tCGz+C3M=
    =XpWr
    -----END PGP SIGNATURE-----

    Comment

    • Bram Stolk

      #3
      Re: using filedescriptors in SIGINT signal handler

      jepler@unpython ic.net wrote:[color=blue]
      > If you're talking about a Python function registered as a handler by
      > signal.signal, then there should not be any restrictions on what you do
      > in that function.
      >
      > Here's a small program I wrote:
      > #------------------------------------------------------------------------
      > import os, signal, time
      >
      > def h(*args): os.write(fd, "data\n");
      >
      > print "my pid is", os.getpid()
      > subproc = os.popen("cat -n", "w")
      > fd = subproc.fileno( )
      >
      > signal.signal(s ignal.SIGINT, h)
      >
      > while 1:
      > time.sleep(1)
      > #------------------------------------------------------------------------
      >
      > I ran this and in another terminal I repeatedly typed 'kill -INT nnnn',
      > where nnnn is the pid printed by my program. Each time, another line is
      > output by 'cat'.
      >
      > When I try to deliver the signal by hitting ctrl-c in that terminal, the
      > first time nothing happens and the second time I get the message
      > OSError: [Errno 32] Broken pipe
      > in this case, I believe that the first signal was delivered to cat,
      > causing it to exit. The second signal was delivered to the python
      > program, which obviously couldn't write to the stdin of a process that
      > had exited.[/color]

      Ah!
      ofcourse...

      It makes sense now to me.
      I, indeed, used Ctrl-C, and assumed it would go to python, not
      the child process. Wrong assumption ofcourse.

      Thanks.

      Bram
      [color=blue]
      >
      > Jeff[/color]

      Comment

      Working...