【问题标题】:How to run/stop c program from a python script in LinuxOS?如何从 LinuxOS 中的 python 脚本运行/停止 c 程序?
【发布时间】:2017-04-13 05:51:44
【问题描述】:

我有一个c程序基本上是在无限While循环中运行,如下图。

int main(int argc, char** argv )
{    
     Detectdirection *d;
     //Mosquitto
     io_service io;
     deadline_timer t(io);
     MosquitoInterface *m = new MosquitoInterface(t);



     d = new Detectdirection();      
     while(true)
     {        
        int ret =  d->Tracking();
        if(ret < 0)
           cout << "Pattern is not found" << endl ;
     }  
     delete d;
     delete m;
     cout << "Exit" << endl;
     return 0;
}

我喜欢从 python 脚本运行和停止程序。 运行程序非常简单。只是为了提供构建文件的路径,如 here 所述。

但是如何从 Pyhton 停止应用程序,以便正确删除创建的对象。

【问题讨论】:

  • 你不能。如果您终止程序,则对象将不会被正确破坏。内存将被释放,但不会调用它们的析构函数。做到这一点的唯一方法是以某种方式结束循环并让程序以正常方式退出。我建议你看看其他守护进程是怎么做的。
  • 那是来自 boost ASIO 的 io_service 吗?实际上,您可以有一个异步任务等待我在回答中描述的那些消息之一。

标签: python c++ gcc g++


【解决方案1】:

使用python的subprocess.Popen而不是便利函数call启动程序。 Popen 对象有一个 .terminate() 方法,该方法向程序发送信号,该信号将以受控方式停止程序。程序在终止时的行为取决于 C 程序而不是 python。如果您的程序使用signal() 注册回调,则SIGTERM 可以被您的程序捕获和处理。

我建议你编写一些测试程序,并在必要时阅读 C 和 Windows 中的信号处理。

【讨论】:

    【解决方案2】:

    您可以使用函数 os.system() 执行 shell 脚本。所以我支持使用下面的代码,它向C进程发送一个kill信号(C进程的名称是'name':

    def processinfo(x):
        p = psutil.get_process_list()
        for r in p:
            aa = str(r)
            f = re.compile(x,re.I)
            if f.search(aa):
                return aa.split('pid=')
    os.system('kill -9 ' + processinfo(name))
    

    【讨论】:

      【解决方案3】:

      您需要在进程之间进行通信。

      向进程发送信号(并在可执行文件中捕获该信号)是执行此操作的常用方法。

      从 python 发送信号:How to terminate a python subprocess launched with shell=True

      处理信号: Signal Handling in C

      或者,您可以使用更高级的技术来发送消息(例如 zeromq Understanding ZeroMQ 、 dbus https://stackoverflow.com/questions/tagged/dbus 或 COM COM, COM+, DCOM, where to start?

      这里的关键词是进程间通信。它有自己的维基百科文章https://en.wikipedia.org/wiki/Inter-process_communication

      【讨论】:

        猜你喜欢
        • 2021-01-27
        • 2013-11-15
        • 2018-02-22
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 2010-10-13
        相关资源
        最近更新 更多