2016-11-29 92 views
3

我有一个c程序,基本上是运行在无限循环中,如下图所示:While如何在LinuxOS中从python脚本运行/停止c程序?

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的应用程序,以便这些创建的对象被正确删除。

+0

你不能。如果你杀死了这个程序,这些对象将不会被正确的破坏。内存将被释放,但它们的析构函数将不会被调用。唯一的方法是以某种方式结束循环并让程序以正常方式退出。我建议你看看其他守护进程怎么做。 –

+0

这是来自boost ASIO的'io_service'吗,实际上你可能有一个异步任务正在等待我在我的答案中描述的那些消息之一。 – Lanting

回答

5

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

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

发送从蟒蛇的信号: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

0

你可以使用函数os.system()来执行shell脚本。因此,我支持使用如下代码,该代码发送一个终止信号到C处理(C过程的名称是“名称”:使用

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)) 
0

启动程序python的subprocess.Popen而非便利功能callPopen对象有一个方法,它发送一个信号给程序,它将以受控的方式停止程序。程序在终止时的行为如何,取决于C程序而不是python。如果您的程序使用signal()注册了回拨,则SIGTERM可以被您的程序捕获和处理。

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

相关问题