Linux에서 실행되는 Julia 프로그램에서는 콘솔 창의 크기를 조정할 때 전용 작업을 시작해야합니다. 어떻게 Julia에서 시스템 신호 SIGWINCH (창 크기 조정)를 가로 채서 필요한 조치를 수행하는 함수를 첨부 할 수 있습니까?
Ada에서는 그것을 선언하는 것이 다소 간단합니다.
protected Signalhandler is
procedure Handlewindowresizing;
pragma Attach_Handler (Handlewindowresizing, SIGWINCH);
end Signalhandler;
SCHEMER의 아이디어에 기반한 임시 솔루션 : SIGWINCH 중단 모니터링을 수행하는 C 라이브러리를 사용하려고합니다.
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-벽 -fPIC myLibrary.c
gcc -shared -fPIC -o myLibrary.so myLibrary.o
C-Library를 사용하는 Julia의 프로그램 :
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 프로그램은 올바르게 실행되지만 터미널 창의 크기가 조정되면 세그먼트 결함 (코어 덤프)이 발행되고 프로그램은 코드 : 139로 종료되었다고합니다.
문제는이 세그먼테이션 결함이 어디에서 오는가? 컴파일 모델에서? Julia는 C가 신호 모니터링을 관리하는 메모리 부분에서 코드 실행을 제어 할 권리가 없습니까?
Sig_handler에서 println 작업을 제거하면 세그먼테이션 오류가 억제됩니다.
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