信号和杀死C.

时间:2016-05-04 22:44:34

标签: c unix signals kill

我正在学习signal(),我有两个文件:

server.c:

void handler_sigcont(){
  printf("SIGCONT server\n");
}

int main(){
  signal(SIGCONT,handler_sigcont);
  printf("%d\n",getpid());
  kill(getpid(),SIGSTOP);
  printf("server!\n");
}

client.c:

int main(int argc, char** argv){
  kill(atoi(argv[1]),SIGCONT);
  printf("client!\n");
}

首先我执行server.c,这是输出:

6999

[7]+  Stopped                 ./sobusrv

然后我像这样执行client.c:

./client 6999

唤醒进程6999。 输出如下:

client!
SIGCONT server
server!
[8]   Done                    ./sobusrv

但是,如果在server.c中,我在signal()之后更改kill(),就像这样:

void handler_sigcont(){
  printf("SIGCONT server\n");
}

int main(){

  printf("%d\n",getpid());
  kill(getpid(),SIGSTOP);
  printf("server!\n");
  signal(SIGCONT,handler_sigcont);
}

我得到了这个输出:

client!
server!
[8]   Done                    ./sobusrv

我想知道为什么在signal()之后写kill()时避免使用处理程序。

3 个答案:

答案 0 :(得分:2)

在服务器signal()之后写入kill()的呼叫时,这意味着在服务器收到SIGCONT之前,信号处理程序才会安装。这是因为服务器中的kill()调用会立即生效以暂停服务器进程。

在服务器收到SIGCONT时,将使用默认处理程序,因为尚未安装其他处理程序。

答案 1 :(得分:1)

没有避免,但操作顺序不同。在您注册处理程序之前,您的服务器会收到STOP信号。当你发送SIGCONT时,它继续,然后注册处理程序并退出而不接收另一个信号。对于在注册处理程序之前发生的信号,不会执行处理程序。

答案 2 :(得分:1)

你可以像这样使用raise(SIGCONT)函数:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "XML=%~1"
set "TAG=%~2"
set "PAR=%~3"

rem // Define defaults here:
if not defined XML set "XML=presentation.xml"
if not defined TAG set "TAG=slideshow"
if not defined PAR set "PAR=date"

set "FLAG="
for /F usebackq^ delims^=^ eol^= %%L in ("%XML%") do (
    set "LINE=%%L"
    setlocal EnableDelayedExpansion
    set "REST=!LINE:*<%TAG%=!"
    if not defined REST (
        set "FLAG=#"
    ) else (
        set "REST=!LINE:*<%TAG% =!"
        if not "!REST!"=="!LINE!" (
            set "FLAG=#"
        ) else (
            set "REST=!LINE:*<%TAG% =!"
            if not "!REST!"=="!LINE!" (
                set "FLAG=#"
            )
        )
    )
    for /F "tokens=1,2 delims=>" %%E in ("!REST!/") do (
        if defined FLAG (
            endlocal
            set "FLAG=#"
        ) else (
            endlocal
        )
        set "REST=%%E"
        if defined FLAG (
            call :GET_ATTR "REST:~,-1" "%PAR%"
        )
        if not "%%F"=="" (
            set "FLAG="
        )
        setlocal EnableDelayedExpansion
    )
    endlocal
)

endlocal
exit /B


:GET_ATTR var_string param_name
setlocal DisableDelayedExpansion
set "PAR=%~2"
setlocal EnableDelayedExpansion
set "STR=!%~1!"
set "NEXT="
for %%S in (!STR!) do (
    if defined NEXT (
        endlocal
        echo(%%~S
        set "NEXT="
        setlocal EnableDelayedExpansion
    )
    set "STR=!STR:*%%S=!"
    if "%%S"=="%PAR%" (
        if defined STR (
            if "!STR:~,1!"=="=" (
                if "!STR:~1,1!"==" " (
                    echo(
                ) else if "!STR:~1,1!"=="   " (
                    echo(
                ) else (
                    set "NEXT=#"
                )
            )
        )
    )
)
if defined NEXT echo(
endlocal
endlocal
exit /B