linux C编程问题 得不到预期结果

搞一个后台运行的进程,当控制台输入kill-sSIGUSR1时向控制台输入当前系统时间,代码如下,但是运行后在控制台输入kill-sSIGUSR1PID(这个后台进程的P... 搞一个后台运行的进程,当控制台输入kill -s SIGUSR1 时向控制台输入当前系统时间,代码如下,但是运行后在控制台输入kill -s SIGUSR1 PID(这个后台进程的PID),控制台并没有显示系统时间,为什么??
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "sys/param.h"
#include <stdio.h>
#include <time.h>
#include <signal.h>
/*使进程实现后台运行*/
int init_daemon(void)
{
int pid,Tpid;
int i;

if(pid=fork())
exit(0);
else if(pid< 0)
exit(1);
setsid();
if(pid=fork())
exit(0);
else if(pid< 0)
exit(1);
for(i=0;i<NOFILE;i++)
close(i);
chdir(".");
umask(0);
return Tpid;
}

void signal_D(int signal)
{
/*当收到SIGUSR1信号时向控制台输出系统时间*/
time_t t;
t=time(0);
printf("%s\n", asctime(localtime(&t)) );
exit(0); /*退出进程*/
}

int main(int argc, char ** argv)
{
init_daemon();//初始化为Daemon

signal(SIGCHLD, SIG_IGN);/*忽略子进程退出信号,若在此之后又产生了子进程,
如果不处理此信号,将在子进程退出后产生僵尸进程*/
signal(SIGUSR1, signal_D);/*处理SIGUSR1信号*/
}
是不是此后台进程没有控制终端,进而导致了进程无法向控制台输出数据??
展开
 我来答
handsoul
2011-05-21 · TA获得超过955个赞
知道小有建树答主
回答量:500
采纳率:0%
帮助的人:758万
展开全部
首先,显而易见,你的deamon进程直接结束掉了...至少要保证恒这个daemon一直处于等待信号的状态吧,循环执行sigsuspend吧,你这个后台没什么循环执行的过程,很快就结束了吧

其次,你fork的用法也是有问题..你上面的过程产生了4个进程..fork会返回两次,fork后面的代码是被子进程和父进程同时执行的,唯一区别两者的方法就是fork返回的pid。你再看下一般fork怎么使用的...

有pid就可以,不管是前台后台,只要发送信号对应的权限满足,kill就可以向一个pid发送信号
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式