我需要從c程序發送一些數據到Perl程序,這兩個程序都處於運行模式(睡眠模式下的Perl程序和正在運行的c程序,以及c程序將數據發送到Perl)。發送數據從c到perl
我知道,可以通過套接字和共享內存來寫這個程序,但是我有性能問題。我認爲共享內存是更好的解決方案,我如何向Perl程序發出喚醒信號並恢復運行並讀取c發送的數據?
我需要從c程序發送一些數據到Perl程序,這兩個程序都處於運行模式(睡眠模式下的Perl程序和正在運行的c程序,以及c程序將數據發送到Perl)。發送數據從c到perl
我知道,可以通過套接字和共享內存來寫這個程序,但是我有性能問題。我認爲共享內存是更好的解決方案,我如何向Perl程序發出喚醒信號並恢復運行並讀取c發送的數據?
使用像MySql這樣的數據庫。
如果你擔心性能在C中實現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-
鑑於OP關心的性能考慮使用共享內存而不是unix套接字,我不知道信號在這方面做得有多好? – user2719058 2014-02-02 11:40:56
有一個看題目:「嵌入 Perl(使用C語言的Perl)」 - 第21章 每L編程第三版 - 拉里牆
見Internals and C language interface特意這個 本部的Perl調用約定從 Ç。
然後,您將會知道如何在C和Perl程序之間 有效地發送數據 。
您一直提到「性能問題」。
您能否更具體地瞭解您的性能要求?在我們提出最佳解決方案之前,我們需要知道這一點。否則,我們只是猜測。
在「猜測」的範疇,我會建議:
這兩種備選方案將是絕大多數的「真實世界」場景優良替代品我能想到。
我們絕對需要關於您特定場景的更多細節。
預先感謝您.. PSM
解釋一下:最好有一些關於程序爲什麼很慢的想法:它是否保持100%的CPU忙?讀取和寫入數據是否花費太多時間?你內存不足? – reinierpost 2010-08-26 16:42:58
使用數據庫就像SQLite的,那麼你並不需要安裝數據庫服務器。
SQLite Library:http://metacpan.org/pod/DBD::SQLite
不,我不能。我有嚴重的性能問題 – hamSh 2010-08-26 12:13:48