linux中用kill函数给init进程发送一个终止信号有什么后果

2024-12-05 01:08:06
推荐回答(3个)
回答(1):

别容易出现问题。
pid=fork();
if(pid==0)
{
子进程处理....
}
else if(pid >0)
{
父进程处理....
}
else
fork出错处理

把你的程序改成上述形式之后,
kill完了,检查下kill的返回值,没有错误。我换了一个信号,SIGUSR1,并且给它注册了一个简单的信号处理函数,问题就搞定了。
SIGCONT的默认的信号处理函数不知道是什么,但是发送SIGCONT并不能让子进程返回,除非手动的注册一个信号处理函数。

你试试吧。。我简单修改的程序,好像在子进程里面exec没反应,但exec没错:
#include
#include
#include
#include
#include
#include
#include

void tasksighandler(int signalnum);

void init()
{
signal(SIGUSR1,tasksighandler);
printf("task is ready ...\n");
printf("task's pid= %d\n",getpid());
pause(); //子程序挂起
printf("task's restarted...\n");
int a=0;
for(a=0;a<10;a++)
{
printf("task is diong ...\n");
sleep(1);
}
execl("/bin/ls","ls",NULL);

perror("execl");
}

void tasksighandler(int signalnum)
{
printf("OK,catch the signal\n");
}

int main()
{
int i;
pid_t pid=0;
pid=fork();
if (pid == 0) /* 子进程执行此命令 */
{
signal(SIGUSR1,tasksighandler);
printf("task is ready ...\n");
//printf("task's pid= %d\n",getpid());
pause(); //子程序挂起
printf("task's restarted...\n");
int a=0;
for(a=0;a<5;a++)
{
printf("task is diong ...\n");
sleep(1);
}

}

else if(pid > 0)
{
printf("pid is %d\n",pid);

sleep(5);
int retCode=kill(pid,SIGUSR1); //父进程给子进程发送信号,要求子进程继续运行
if(retCode <0)
{
perror("send signal error");
}

sleep(8);
return 0;
}

else
{
perror("fork error\n");
exit(-1);
}
}

下面是关于SIGCONT的一些说明,好像你这里使用的场合并不适合:
在 POSIX-服从的平台, SIGCONT 是 信号 送到再开始a 计算机程序 由早先停留 SIGSTOP 信号。 符号常数 为SIGCONT在被定义 标头文件 signal.h. 符号信号名字,因为信号数字可能横跨平台,变化使用。
用法

当 SIGSTOP 在它的现状被送到过程,通常行为是停留那个过程。 如果送它SIGCONT信号,过程只将恢复施行。 SIGSTOP和SIGCONT使用为 作业控制 在 UNIX外壳程序在其他目的中。
另外,虚机团上产品团购,超级便宜

回答(2):

init进程是特殊进程,它不接收也不处理信号。
你发送终止信号给它是不会有任何结果的。

下面是2.4.0内核源代码中do_signal()函数前面的一段注释:
/*
* Note that 'init' is a special process: it doesn't get signals it doesn't
* want to handle. Thus you cannot kill init even with a SIGKILL even by
* mistake.
*/

回答(3):

别容易出现问题。
pid=fork();
if(pid==0)
{
子进程处理....
}
else if(pid >0)
{
父进程处理....
}
else
fork出错处理

把你的程序改成上述形式之后,
kill完了,检查下kill的返回值,没有错误。我换了一个信号,SIGUSR1,并且给它注册了一个简单的信号处理函数,问题就搞定了。
SIGCONT的默认的信号处理函数不知道是什么,但是发送SIGCONT并不能让子进程返回,除非手动的注册一个信号处理函数。

你试试吧。。我简单修改的程序,好像在子进程里面exec没反应,但exec没错:
#include
#include
#include
#include
#include
#include
#include

void tasksighandler(int signalnum);

void init()
{
signal(SIGUSR1,tasksighandler);
printf("task is ready ...\n");
printf("task's pid= %d\n",getpid());
pause(); //子程序挂起
printf("task's restarted...\n");
int a=0;
for(a=0;a<10;a++)
{
printf("task is diong ...\n");
sleep(1);
}
execl("/bin/ls","ls",NULL);

perror("execl");
}

void tasksighandler(int signalnum)
{
printf("OK,catch the signal\n");
}

int main()
{
int i;
pid_t pid=0;
pid=fork();
if (pid == 0) /* 子进程执行此命令 */
{
signal(SIGUSR1,tasksighandler);
printf("task is ready ...\n");
//printf("task's pid= %d\n",getpid());
pause(); //子程序挂起
printf("task's restarted...\n");
int a=0;
for(a=0;a<5;a++)
{
printf("task is diong ...\n");
sleep(1);
}

}

else if(pid > 0)
{
printf("pid is %d\n",pid);

sleep(5);
int retCode=kill(pid,SIGUSR1); //父进程给子进程发送信号,要求子进程继续运行
if(retCode <0)
{
perror("send signal error");
}

sleep(8);
return 0;
}

else
{
perror("fork error\n");
exit(-1);
}
}

下面是关于SIGCONT的一些说明,好像你这里使用的场合并不适合:
在 POSIX-服从的平台, SIGCONT 是 信号 送到再开始a 计算机程序 由早先停留 SIGSTOP 信号。 符号常数 为SIGCONT在被定义 标头文件 signal.h. 符号信号名字,因为信号数字可能横跨平台,变化使用。
用法

当 SIGSTOP 在它的现状被送到过程,通常行为是停留那个过程。 如果送它SIGCONT信号,过程只将恢复施行。 SIGSTOP和SIGCONT使用为 作业控制 在 UNIX外壳程序在其他目的中。