前一段时间用了system()函数调用脚本启动另一个进程,发现两个问题:
1.执行killall命令杀新启进程时会连原进程一起kill掉.
2.原进程打开的侦听端口,如果新启动的进程不退出无法释放(socket资源未释放).
查看system()代码,原来system函数也是用的fork实现的,示例代码如下:
1.执行killall命令杀新启进程时会连原进程一起kill掉.
2.原进程打开的侦听端口,如果新启动的进程不退出无法释放(socket资源未释放).
查看system()代码,原来system函数也是用的fork实现的,示例代码如下:
01 |
#include <signal.h> |
02 |
int system ( const char *cmd) |
03 |
{
|
04 |
int stat; |
05 |
pid_t pid; |
06 |
struct sigaction sa, savintr, savequit; |
07 |
sigset_t saveblock; |
08 |
if (cmd == NULL) |
09 |
return (1); |
10 |
sa.sa_handler = SIG_IGN; |
11 |
sigemptyset(&sa.sa_mask); |
12 |
sa.sa_flags = 0; |
13 |
sigemptyset(&savintr.sa_mask); |
14 |
sigemptyset(&savequit.sa_mask); |
15 |
sigaction(SIGINT, &sa, &savintr); |
16 |
sigaction(SIGQUIT, &sa, &savequit); |
17 |
sigaddset(&sa.sa_mask, SIGCHLD); |
18 |
sigprocmask(SIG_BLOCK, &sa.sa_mask, &saveblock); |
19 |
if ((pid = fork()) == 0) {
|
20 |
sigaction(SIGINT, &savintr, ( struct sigaction *)0); |
21 |
sigaction(SIGQUIT, &savequit, ( struct sigaction *)0); |
22 |
sigprocmask(SIG_SETMASK, &saveblock, (sigset_t *)0); |
23 |
execl( "/bin/sh" , "sh" , "-c" , cmd, ( char *)0); |
24 |
_exit(127); |
25 |
} |