2016-11-29 115 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上的信號處理。

相關問題