2010-08-26 54 views
4

我需要從c程序發送一些數據到Perl程序,這兩個程序都處於運行模式(睡眠模式下的Perl程序和正在運行的c程序,以及c程序將數據發送到Perl)。發送數據從c到perl

我知道,可以通過套接字和共享內存來寫這個程序,但是我有性能問題。我認爲共享內存是更好的解決方案,我如何向Perl程序發出喚醒信號並恢復運行並讀取c發送的數據?

回答

2

使用像MySql這樣的數據庫。

如果你擔心性能在C中實現perl代碼,反之亦然。

+0

不,我不能。我有嚴重的性能問題 – hamSh 2010-08-26 12:13:48

7

你似乎有這裏有兩個問題:可用

  1. 如何在Perl程序和C程序之間共享內存,並
  2. 如何信號Perl程序有新數據

    假設您所在的系統允許SysV IPC調用,您可以使用IPC::ShareLite在兩個進程之間共享一塊內存。

    像往常一樣使用共享內存,您必須確保鎖定到位。 IPC :: ShareLite的模塊手冊頁似乎很好地解釋了錯綜複雜和方法調用。

    關於發信號的Perl程序有新的數據可用,沒有什麼能阻止你使用...信號來實現這一點!你的C程序可以發送一個SIGUSR1到Perl程序,Perl程序將訪問共享內存,並在接收到信號時做其他事情,否則就會進入休眠狀態。

    看一看perldoc perlipc對於這一點,但它的要點是沿着這些路線的東西:

    use strict; 
    use warnings; 
    use IPC::ShareLite; 
    
    # init shared memory 
    
    sub do_work { 
        # use shared memory, as you just received a signal 
        # indicating there's new data available 
        my $signame = shift; 
        # ... 
    } 
    $SIG{USR1} = \&do_work; # when signaled with SIGUSR1, call do_work() 
    
    # else just sleep 
    while(1) { sleep 1; } 
    

    希望這有助於

    -marco-

+0

鑑於OP關心的性能考慮使用共享內存而不是unix套接字,我不知道信號在這方面做得有多好? – user2719058 2014-02-02 11:40:56

3
  • 有一個看題目:「嵌入 Perl(使用C語言的Perl)」 - 第21章 每L編程第三版 - 拉里牆

  • Internals and C language interface特意這個 本部的Perl調用約定從 Ç

    然後,您將會知道如何在C和Perl程序之間 有效地發送數據 。

1

您一直提到「性能問題」。

您能否更具體地瞭解您的性能要求?在我們提出最佳解決方案之前,我們需要知道這一點。否則,我們只是猜測。

在「猜測」的範疇,我會建議:

  • 數據庫

這兩種備選方案將是絕大多數的「真實世界」場景優良替代品我能想到。

我們絕對需要關於您特定場景的更多細節。

預先感謝您.. PSM

+0

解釋一下:最好有一些關於程序爲什麼很慢的想法:它是否保持100%的CPU忙?讀取和寫入數據是否花費太多時間?你內存不足? – reinierpost 2010-08-26 16:42:58