ในโปรแกรม Julia ที่ทำงานภายใต้ Linux ฉันจำเป็นต้องเปิดใช้งานแอคชั่นเฉพาะเมื่อปรับขนาดหน้าต่างคอนโซล ดังนั้นใน Julia ฉันจะตัดสัญญาณของระบบ SIGWINCH (ปรับขนาดหน้าต่าง) และแนบไปกับฟังก์ชันที่ดำเนินการตามที่ต้องการได้อย่างไร
ใน Ada ค่อนข้างตรงไปตรงมาที่จะประกาศ:
protected Signalhandler is
procedure Handlewindowresizing;
pragma Attach_Handler (Handlewindowresizing, SIGWINCH);
end Signalhandler;
แนวทางแก้ไขปัญหาเกี่ยวกับความคิดพื้นฐานของความคิด: ฉันพยายามใช้ห้องสมุด C ซึ่งดำเนินการตรวจสอบการหยุดชะงักของ 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 -shared -fPIC -o myLibrary.so myLibrary.o
โปรแกรมใน Julia ที่ใช้ C-Library:
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
โปรแกรม Julia ทำงานได้อย่างถูกต้อง แต่เมื่อหน้าต่างเทอร์มินัลถูกปรับขนาดข้อผิดพลาดในการแบ่งส่วน (การถ่ายโอนข้อมูลหลัก) จะถูกใช้
ดังนั้นคำถามคือความผิดของการแบ่งส่วนนี้มาจากไหน? จากรูปแบบการรวบรวม? Julia ไม่มีสิทธิ์ในการควบคุมการใช้รหัสในส่วนของหน่วยความจำที่ C จัดการกับการตรวจสอบสัญญาณ?
การลบการดำเนินการ println ใน Sig_handler ระงับข้อผิดพลาดในการแบ่งกลุ่ม:
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