我正在学习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()
时避免使用处理程序。
答案 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