I was at least half right, then. Python was eating the signals. :)

As an alternative, to prevent yourself from having to do this in every loop in your code, you might try this on the python side:

import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)

That'll stop Python from catching SIGINT globally and will always send the SIGINT down to the C++ and terminate.

Of course, that may or may not be an option depending on your specific needs.

On 12/23/2012 3:02 AM, simon zhang wrote:
This is the answer from the stackoverflow.

|    while  (true)  {  //endless loop
        ++it;
        std::cout<<  it<<std::endl;
        sleep(3);
        if(PyErr_CheckSignals()  ==  -1)  {
            exit(1);
        }
    }|

2012/12/23 Jaedyn K. Draper <jaedyn.cpp...@jaedyn.co <mailto:jaedyn.cpp...@jaedyn.co>>

    Oh, my mistake. Not sure then, I've only embedded, never extended.
    Maybe someone else can help. :(


    On 12/23/2012 1:59 AM, simon zhang wrote:
    But I  don't call Py_Initialize().I call C++ code in
    Python.Don't  embed the Python to C++...

    2012/12/23 Jaedyn K. Draper <jaedyn.cpp...@jaedyn.co
    <mailto:jaedyn.cpp...@jaedyn.co>>

        Instead of Py_Initialize() (wherever it is you call it), try
        calling Py_InitializeEx(0). Py_Initialize() (or
        Py_InitializeEx(1)) binds signal handlers (including SIGINT)
        to send python exceptions instead of killing the process.
        This may be what's hitting you.


        On 12/23/2012 1:44 AM, simon zhang wrote:
        I have make a boost.python module with an endless loop.But I
        can't kill the process by ctrl-c.The following is an example.

        C++

        |#include  <boost/python.hpp>
        #include  <boost/python.
        module.hpp>
        #include  <boost/python.
        def.hpp>
        #include  <iostream>
        usringnamespace  boost::python;

        void  foo()  {
            int  it=0;
            while  (true)  {                      //endless loop
                ++it;
                std::cout<<  it<<std::endl;
                sleep(3);
            }
        }

        BOOST_PYTHON_MODULE(ctopy)
        {
             def("foo",foo);
        }|

        python:

        |import  ctopy
        ctopy.foo()|

        result:

        |1
        2
        3
        4
        .....................|

        I can't kill the foreground process by Ctrl-c.why the module
        don't accept signal "SIGINT" that was sent by Ctrl-c.How to
        make it work.



        _______________________________________________
        Cplusplus-sig mailing list
        Cplusplus-sig@python.org  <mailto:Cplusplus-sig@python.org>
        http://mail.python.org/mailman/listinfo/cplusplus-sig


        _______________________________________________
        Cplusplus-sig mailing list
        Cplusplus-sig@python.org <mailto:Cplusplus-sig@python.org>
        http://mail.python.org/mailman/listinfo/cplusplus-sig




    _______________________________________________
    Cplusplus-sig mailing list
    Cplusplus-sig@python.org  <mailto:Cplusplus-sig@python.org>
    http://mail.python.org/mailman/listinfo/cplusplus-sig


    _______________________________________________
    Cplusplus-sig mailing list
    Cplusplus-sig@python.org <mailto:Cplusplus-sig@python.org>
    http://mail.python.org/mailman/listinfo/cplusplus-sig




_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to