জুলিয়ায় সিস্টেম সংকেত বাধা


9

লিনাক্সের অধীনে চলমান একটি জুলিয়া প্রোগ্রামে, যখন কনসোল উইন্ডোটি পুনরায় আকার দেওয়া হয় তখন আমাকে একটি ডেডিকেটেড অ্যাকশন চালু করতে হবে। তাহলে জুলিয়াতে কীভাবে আমি সিস্টেমে সিগন্যাল সিগউইনচ (উইন্ডো রাইজাইজিং) বাধা দিতে এবং এর সাথে একটি ক্রিয়া সংযুক্ত করতে পারি যা প্রয়োজনীয় ক্রিয়া সম্পাদন করে?

অ্যাডায় এটি ঘোষণা করা বরং সোজা:

 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  

1
এটি ccall ((: সিগন্যাল ...) এবং @cfunction ব্যবহার করে একটি সিগন্যালহ্যান্ডলার্স.জেএল মডিউল হিসাবে বাস্তবে রূপ দেওয়া মোটামুটি সোজা হওয়া উচিত, তবে আফাইক এটি করা হয়নি
বিল

আপনার পরামর্শটি ভাল ছিল। ধন্যবাদ.
এমিল

উত্তর:


4

যেহেতু এখন পর্যন্ত কেউ এই প্রশ্নের জবাব দেয়নি, একটি সম্ভাব্য কাজটি কিছু সময়ের ব্যবধানে অবিচ্ছিন্নভাবে টার্মিনালের আকার পর্যবেক্ষণ করতে পারে।

function monitor_term(func)
    @async begin 
        curr_size = displaysize(stdout)
        while (true)
            sleep(0.1)
            new_size = displaysize(stdout)
            if new_size != curr_size
                curr_size = new_size
                func()
            end
        end
    end
end

এবং এখন নমুনা ব্যবহার:

julia> monitor_term(() -> print("BOO!"))
Task (runnable) @0x0000000013071710

টার্মিনালটি যতদিন বেঁচে থাকবে ততক্ষণ তার আকারের যে কোনও পরিবর্তন মুদ্রণ করবে BOO!


বর্তমান কনসোল উইন্ডোর আকার পাওয়ার জন্য আমি এই দুর্দান্ত উপায়টি জানতাম না। প্রদর্শন (স্টাডআউট) আপনাকে ধন্যবাদ
এমিল

0

হ্যাঁ, এটি প্রকৃতপক্ষে একটি ফ্যালব্যাক সমাধান যা প্রতিশ্রুতি পূর্ণ একটি নতুন ভাষা থেকে প্রত্যাশা করা খুব কমই হয় ... তবে থ্রাশের অভাবে আমরা আসলে ব্ল্যাকবার্ড (হাসি) খেতে পারি।

তবে জুলিয়া যদি ইউনিক্স / লিনাক্স বিশ্বের সিস্টেম সিগন্যালগুলিকে বিবেচনায় নিতে সক্ষম না হয়, তবে সিএন লাইব্রেরি ব্যবহার করে এটি করা সম্ভব হতে পারে যা সিগন্যাল। অ্যাক্সেস করে।

 #include <stdio.h>
 #include <stdlib.h>
 #include <signal.h>

 void sig_handler(int signum)
 {
    printf("Received signal %d\n", signum);
 }

int main()
{
   signal(SIGINT, sig_handler);
   sleep(10); // This is your chance to press CTRL-C
   return 0;
}

সিস্টেম সিগন্যাল পাওয়ার পরে আমাদের প্রত্যাশা অনুযায়ী জুলিয়া ফাংশনটি সংজ্ঞায়িত করতে হবে। সি-তে এটি সিগ_হ্যান্ডলার হিসাবে ব্যবহারযোগ্য করে তুলুন এবং জুলিয়া থেকে সি স্টেটমেন্ট সিগন্যাল (সাইনচিন্চ, সিগ_হ্যান্ডলার) কল করুন;

আমি সঠিক কোড লিখতে জুলিয়ার সাথে যথেষ্ট পরিচিত নই। তবে এই ধারণাটি ...


আপনার প্রস্তাবটি আমি বাস্তবায়নের চেষ্টা করব।
এমিল

@ ইমেল যদি আপনি এটি বাস্তবায়িত করতে পরিচালনা করেন (জুলিয়া লেখা সহ ccal) এবং পরে এটি একটি আদর্শ জুলিয়া প্যাকেজ তৈরি করতে চান তবে আমি প্যাকেজিংয়ে সহায়তা করতে পারি।
প্রেজেমিস্লা সুফেল

যথাযথভাবে উল্লেখ ! আমাকে জুলিয়া ডকুমেন্টেশনে আরও কিছুদূর যেতে হবে।
এমিল

@ প্রজেমিস্লাভ সুফেল: আমার প্রশ্নটির পরিপূরক হিসাবে সিগমেন্টেশন দোষটি কীভাবে বাধা ধরতে ব্যবহৃত হয় সে সম্পর্কে আপনার উপরের অংশীদোষ দোষ সম্পর্কে বিশ্লেষণ কী?
এমিল

আমি জুলিয়া-সি ইন্টিগ্রেশন কোডটি লিখছি না। যাইহোক, আমি জানি যে খুব দীর্ঘ সময় ধরে সেগফাল্ট ত্রুটি ছিল যখনই জুলিয়া থ্রেডে কোনও সিস্টেম আইও ব্যবহৃত হত তাই সম্ভবত সেখানে কিছু সমস্যা রয়েছে। প্রথম পদক্ষেপে টার্মিনালের আকার না জিজ্ঞাসা করে আপনি যখন প্রিন্টলন ("বু") করেন তখন কী ঘটে যায় তা দেখার চেষ্টা করুন।
প্রেজেমিস্লা সুফেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.