লিনাক্সের অধীনে চলমান একটি জুলিয়া প্রোগ্রামে, যখন কনসোল উইন্ডোটি পুনরায় আকার দেওয়া হয় তখন আমাকে একটি ডেডিকেটেড অ্যাকশন চালু করতে হবে। তাহলে জুলিয়াতে কীভাবে আমি সিস্টেমে সিগন্যাল সিগউইনচ (উইন্ডো রাইজাইজিং) বাধা দিতে এবং এর সাথে একটি ক্রিয়া সংযুক্ত করতে পারি যা প্রয়োজনীয় ক্রিয়া সম্পাদন করে?
অ্যাডায় এটি ঘোষণা করা বরং সোজা:
protected Signalhandler is
procedure Handlewindowresizing;
pragma Attach_Handler (Handlewindowresizing, SIGWINCH);
end Signalhandler;
স্কিমারের আইডিয়া ভিত্তিক টেন্টিটিভ সলিউশন: আমি সি সি লাইব্রেরি ব্যবহার করার চেষ্টা করি যা সাইনচিন বাধা নিরীক্ষণ পরিচালনা করে।
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-shared -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
জুলিয়া প্রোগ্রামটি সঠিকভাবে চালিত হয় তবে টার্মিনাল উইন্ডোটি পুনরায় আকার দেওয়া হলে একটি সেগমেন্টেশন ফল্ট (কোর ডাম্পড) জারি করা হয় এবং প্রোগ্রামটি কোড সহ প্রকাশিত হয়: ১৩৯।
সুতরাং প্রশ্নটি এই বিভাগটি ত্রুটি কোথা থেকে আসে? সংকলন মডেল থেকে? জুলিয়া যেখানে সি সিগন্যাল পর্যবেক্ষণ পরিচালনা করে মেমরি অংশে কোড সম্পাদন নিয়ন্ত্রণ করার অধিকার নেই?
সিগ_হ্যান্ডলারে প্রিন্টলন অপারেশন সরিয়ে বিভাগগুলি ত্রুটি দমন করে:
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