我正在尝试调用 cmake 并将输出重定向到管道。
重现:
git clone https://github.com/avast/retdec
(似乎每个CMake项目、gradle项目都不起作用)mkdir build&&cd build
test.hs
:import System.Posix.IO
import System.Process
import System.Exit
import System.IO
main :: IO ()
main = do
(code, content) <- createProcessRedirected "cmake" ["..", "-DCMAKE_INSTALL_PREFIX=/opt/root/"]
case code of
ExitFailure _ -> do
putStrLn ("OOPS" ++ content)
return ()
_ -> do
putStrLn "After cmake"
(code2, content2) <- createProcessRedirected "make" ["install", "-j8"]
case code2 of
ExitFailure _ -> do
putStrLn ("OOPS" ++ content2)
return ()
_ -> do
putStrLn "SUCCESS" …
Run Code Online (Sandbox Code Playgroud) 假设我有以下程序:
#include <signal.h>
#include <stddef.h>
#include <stdlib.h>
static void myHandler(int sig){
abort();
}
int main(void){
signal(SIGSEGV,myHandler);
char* ptr=NULL;
*ptr='a';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我注册了一个信号处理程序和一些行,我取消引用了一个空指针 ==> 触发了 SIGSEGV。但它是如何触发的?如果我使用strace
(输出剥离)运行它:
//Set signal handler (In glibc signal simply wraps a call to sigaction)
rt_sigaction(SIGSEGV, {sa_handler=0x563b125e1060, sa_mask=[SEGV], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7ffbe4fe0d30}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
//SIGSEGV is raised
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} ---
rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1], [SEGV], 8) = 0
Run Code Online (Sandbox Code Playgroud)
但是缺少一些东西,信号如何从 CPU 传递到程序?我的理解:
[Dereferences null pointer] -> …
Run Code Online (Sandbox Code Playgroud)