जूलिया प्रोग्राम में जो लिनक्स के तहत चलता है, मुझे कंसोल विंडो के आकार बदलने पर एक समर्पित कार्रवाई शुरू करने की आवश्यकता है। तो कैसे जूलिया में, मैं सिस्टम सिग्नल SIGWINCH (खिड़की का आकार बदलना) को रोक सकता हूं और इसे एक फ़ंक्शन में संलग्न कर सकता हूं जो आवश्यक कार्रवाई करता है?
Ada में इसे घोषित करना सीधा है:
protected Signalhandler is
procedure Handlewindowresizing;
pragma Attach_Handler (Handlewindowresizing, SIGWINCH);
end Signalhandler;
स्कीम के विचार पर आधारित तम्बू समाधान: मैं एक सी लाइब्रेरी का उपयोग करने की कोशिश करता हूं जो SIGWINCH रुकावट की निगरानी करता है।
myLibrary.h
void Winresize (void Sig_Handler());
myLibrary.c
#include "myLibrary.h"
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void Winresize(void sig_handler (void)) {
signal(SIGWINCH, sig_handler);
}
संकलन और पुस्तकालय की तैयारी
gcc -c -Wall -fPIC myLibrary.c
gcc -sared -fPIC -o myLibrary.so myLibrary.o
जूलिया में कार्यक्रम जो सी-लाइब्रेरी का उपयोग करता है:
function getc1()
ret = ccall(:jl_tty_set_mode, Int32, (Ptr{Cvoid},Int32), stdin.handle, true)
ret == 0 || error("unable to switch to raw mode")
c = read(stdin, UInt8)
ccall(:jl_tty_set_mode, Int32, (Ptr{Cvoid},Int32), stdin.handle, false)
c
end
function traitement() println(displaysize(stdout)); end
Mon_traitement_c = @cfunction(traitement, Cvoid, ())
ccall((:Winresize, "/home/Emile/programmation/Julia/myLibrary.so"), Cvoid, (Ptr{Cvoid},), Mon_traitement_c)
while true
println(getc1())
end
जूलिया कार्यक्रम ठीक से चलता है लेकिन जब टर्मिनल विंडो को आकार दिया जाता है तो एक सेगमेंटेशन फॉल्ट (कोर डंप किया गया) जारी किया जाता है और प्रोग्राम को कोड: 139 के साथ बाहर कर दिया जाता है।
तो सवाल यह है कि यह विभाजन दोष कहाँ से आता है? संकलन मॉडल से? जूलिया को मेमोरी के हिस्से में कोड निष्पादन को नियंत्रित करने का अधिकार नहीं है जहां सी सिग्नल मॉनिटरिंग का प्रबंधन करता है?
सिग_हैंडलर में प्रिंटलाइन ऑपरेशन को हटाने से विभाजन दोष को दबा दिया गया:
curr_size = displaysize(stdout)
new_size = curr_size
function traitement() global new_size ; new_size = displaysize(stdout); return end
Mon_traitement_c = @cfunction(traitement, Cvoid, ())
ccall((:Winresize, "/home/Emile/programmation/Julia/myLibrary.so"), Cvoid, (Ptr{Cvoid},), Mon_traitement_c)
while true
global curr_size, new_size
if new_size != curr_size
curr_size = new_size
println(curr_size)
end
sleep(0.1)
end