小编JCW*_*x86的帖子

如果 stderr 和 stdout 被重定向,进程会挂起

我正在尝试调用 cmake 并将输出重定向到管道。

重现:

  1. git clone https://github.com/avast/retdec(似乎每个CMake项目、gradle项目都不起作用)
  2. mkdir build&&cd build
  3. 添加文件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)

linux haskell process

2
推荐指数
1
解决办法
538
查看次数

如果取消引用空指针,在 CPU 级别会发生什么?

假设我有以下程序:

#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)

c linux cpu assembly signal-handling

0
推荐指数
1
解决办法
295
查看次数

标签 统计

linux ×2

assembly ×1

c ×1

cpu ×1

haskell ×1

process ×1

signal-handling ×1