社区
Linux/Unix社区
帖子详情
守护进程(daemon)中启动另一个程序的问题!
zkxz
2004-08-30 09:39:07
如何在守护进程中启动另外一个程序,使的那个程序可以在某个指定的tty中执行?
各位高手指点一下,已经郁闷很久了!谢谢!
...全文
647
15
打赏
收藏
守护进程(daemon)中启动另一个程序的问题!
如何在守护进程中启动另外一个程序,使的那个程序可以在某个指定的tty中执行? 各位高手指点一下,已经郁闷很久了!谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zkxz
2004-09-07
打赏
举报
回复
为什么没人回答了?yanghuajia(newperson)在不在?
zkxz
2004-09-04
打赏
举报
回复
没有人写过类似的程序吗?
zkxz
2004-08-31
打赏
举报
回复
yanghuajia(newperson),救命啊!
第二次给的代码不行啊!加到我的守护进程中,一启动,就登出,而且按键也没响应!
服务器内的蜗牛
2004-08-31
打赏
举报
回复
命令演示2
1.停止tty1的进程
# ps xj|grep tty1
19356 19361 19361 19361 tty1 19431 S 0 0:00 -bash
19361 19429 19429 19361 tty1 19431 R 0 0:17 yes
19361 19431 19431 19361 tty1 19431 S 0 0:00 less log
9239 19441 19440 9239 pts/9 19440 S 0 0:00 grep tty1
#kill -SIGSTOP 19361 19429 19431
# # ps xj|grep tty1
19356 19361 19361 19361 tty1 19431 T 0 0:00 -bash
19361 19429 19429 19361 tty1 19431 T 0 1:39 yes
19361 19431 19431 19361 tty1 19431 T 0 0:00 less log
9239 19445 19444 9239 pts/9 19444 S 0 0:00 grep tty1
---------# ./simple 我的程序
#ps xj|grep vi
1 19448 19447 9239 pts/9 19453 S 0 0:00 vi
9239 19454 19453 9239 pts/9 19453 S 0 0:00 grep vi
vi 已经在tty1上,好像大部分操作正常。
vi退出后
#kill -SIGCONT 19361 19429 19431
#ps xj|grep tty1
19356 19361 19361 19361 tty1 19431 S 0 0:00 -bash
19361 19429 19429 19361 tty1 19431 R 0 2:17 yes
19361 19431 19431 19361 tty1 19431 S 0 0:00 less log
9239 19468 19467 9239 pts/9 19467 S 0 0:00 grep tty1
一切正常
服务器内的蜗牛
2004-08-31
打赏
举报
回复
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
int fd = 0;
pid_t pid = 0;
setsid();
fd = open("/dev/tty1",O_RDWR);
dup2(fd,0);
dup2(fd,1);
dup2(fd,2);
pid = fork();
if(pid == 0)
{
//tcsetpgrp(fd,getpid());
execl("/bin/vi","vi",NULL);
exit(0);
}
return 1;
}
命令演示
1.停止tty1的进程
# ps xj|grep tty1
1 8521 8521 8521 tty1 8521 S 0 0:00 /sbin/mingetty tty1
9239 19335 19334 9239 pts/9 19334 S 0 0:00 grep tty1
#kill -SIGSTOP 8521
# ps xj|grep tty1
1 8521 8521 8521 tty1 8521 T 0 0:00 /sbin/mingetty tty1
9239 19337 19336 9239 pts/9 19336 S 0 0:00 grep tty1
#ps xj|grep vi
1 19345 19344 9239 pts/9 19349 S 0 0:00 vi
9239 19350 19349 9239 pts/9 19349 S 0 0:00 grep vi
vi 已经在tty1上,好像大部分操作正常。
#kill -SIGCONT 8521
#ps xj|grep tty1
1 19356 19356 19356 tty1 19356 S 0 0:00 /sbin/mingetty tty1
9239 19360 19359 9239 pts/9 19359 S 0 0:00 grep tty1
一切正常
服务器内的蜗牛
2004-08-31
打赏
举报
回复
是我说的不够清楚。
我们当时的做法之一是 先停止那个使用控制终端的进程。(kill SIGSTOP)
然后简单的打开终端读和写.因为只有你在使用该终端,不会有干扰。
用完后再起动那个进程 (kill SIGCONT)
因此这个方法的问题是 找到那个进程id
如果还想偷懒不愿意找,就停止整个session的进程
参考书: Unix 环境高级编程
zkxz
2004-08-30
打赏
举报
回复
比如在tty1中启动mail,或者在tty2中启动vi ^_^
pacman2000
2004-08-30
打赏
举报
回复
指定的tty? 什么意思?
zkxz
2004-08-30
打赏
举报
回复
To yanghuajia(newperson),
谢谢你先!我的确非要做这个工作。我明天会试试上面的代码。
再次感谢!
服务器内的蜗牛
2004-08-30
打赏
举报
回复
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
int fd = 0;
pid_t pid = 0;
//setsid();
pid = fork();
if(pid == 0)
{
//setpgid(0,7182);
fd = open("/dev/pts/6",O_RDWR);
if(dup2(fd,0) == -1)
{
perror("dup2 sid :");
exit(0);
}
if(setsid()== -1)
{
perror("set sid :");
exit(0);
}
if( -1 == setpgid(0,7182))
{
perror("seta pg id :");
// exit(0);
}
if (ioctl(0, TIOCSCTTY, (char *) 1) < 0)
{
perror("TIOCSCTTY error");
exit(0);
}
//if(-1 == (pid =tcgetpgrp(0)))
if(0)
{
perror("tcgetpgrp :");
exit(0);
}
else
printf("tc grp %d\n",pid);
if(tcsetpgrp(0,getpid()) == -1)
perror("tcsetpgrp :");
dup2(0, 1);
dup2(0, 2);
execl("/bin/vi","vi",NULL);
exit(0);
}
//wait(NULL);
sleep(4);
return 1;
}
服务器内的蜗牛
2004-08-30
打赏
举报
回复
最简单的方法 据说是
kill -SIGSTOP 13210(对应的控制终端进程ID)
做完你的事情
kill -SIGCONT 13210(对应的控制终端进程ID)
服务器内的蜗牛
2004-08-30
打赏
举报
回复
很麻烦!一定要完成这个任务吗?如果是我再帮你。不然的话,讨论一下其他方法。
zkxz
2004-08-30
打赏
举报
回复
To yanghuajia(newperson),
我刚才把你的代码加进了我的程序中,是可以的。不过,正如你所说,它只是刚好完成我的工作要求,但又出了很多问题。
我想你这段代码是重新让daemon与tty相关联,使得子进程可以在该tty上执行。那么,完成之后,也应该重新让daemon进程与tty脱离吧!哪该怎么做呢?是不是像daemon初始化时候一样做?
我的daemon程序想在启动了vi之后等待其结束才继续向下执行,于是我就在你的那段代码中加了
if(pid>0)
waitpid(pid);
可是vi启动之后,所有的键盘输入都不是只送给vi,连shell也会接受到,结果造成vi还在执行的同时shell也可以接受命令,我把waitpid去掉了也这样,这是怎么回事呢?
请高手指点迷津!
服务器内的蜗牛
2004-08-30
打赏
举报
回复
很麻烦。要做很多保存和恢复工作。上面的例子只是刚好完成你的工作要求
服务器内的蜗牛
2004-08-30
打赏
举报
回复
//sample
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc, char * argv[])
{
int fd = 0;
pid_t pid = 0;
setsid();
fd = open("/dev/pts/6",O_RDWR);
dup2(fd,0);
dup2(fd,1);
dup2(fd,2);
pid = fork();
if(pid == 0)
{
tcsetpgrp(fd,getpid());
execl("/bin/vi","vi",NULL);
exit(0);
}
return 1;
}
创建
一个
守护进程
(
Daemon
进程)
守护进程
也叫
Daemon
进程(
Daemon
翻译过来就是 后台
程序
的意思)。所以简单的来说
守护进程
是
一个
在后台运行并且不受任何终端控制的进程。是生存期长的一种进程,没有控制终端。它们常常在系统引导装入时
启动
,仅在系统关闭时才终止。
mysql进程
daemon
_
守护进程
(
Daemon
)
守护进程
的概念
守护进程
(
Daemon
)一般是为了保护我们的
程序
/服务的正常运行,当
程序
被关闭、异常退出等时再次
启动
程序
/恢复服务。例如 http 服务的
守护进程
叫 httpd,mysql 服务的
守护进程
叫 mysqld。或者有时候我们需要让我们的
程序
/服务能不
中
断地运行,在关闭终端后也能在后台默默运行,除了可以这样:nohup ./xxx &,也可以写成
Daemon
程序
,例如
一个
服务器...
【Linux】
守护进程
(
Daemon
)的定义,作用,创建流程
守护进程
(
Daemon
)
守护进程
(
Daemon
)1、定义2、作用3、创建流程4、实例参考
守护进程
(
Daemon
) 1、定义
守护进程
是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或循环等待处理某些事件的发生;它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户
程序
提供服务。Linux系统的大多数服务器就是通过
守护进程
实现的。
守护进程
一般在系统
启动
时开始运行,除非强行终止,否则直到系统关机才随之一起停止运行;
守护进程
一般都以root用户权限运行,因为要使用
daemon
(
守护进程
)
Daemon
Daemon
程序
是一直运行的服务端
程序
,又称为
守护进程
。通常在系统后台运行,没有控制终端不与前台交互,
Daemon
程序
一般作为系统服务使用。
Daemon
是长时间运行的进程,通常在系统
启动
后就运行,在系统关闭时才结束。一般说
Daemon
程序
在后台运行,是因为它没有控制终端,无法和前台的用户交互。
Daemon
程序
一般都作为服务
程序
使用,等待客户端
程序
与它通信。我们也把运行的Daem
如何使
一个
进程变成
daemon
进程(
守护进程
)?
daemon
进程又被称为
守护进程
,一般来说它有以下两个特点: 生命周期很长 一旦
启动
,正常情况下不会终止,一直运行到系统退出。但凡事无绝对:
daemon
进程其实也是可以停止的,如很多
daemon
提供了stop命令,执行stop命令就可以终止
daemon
,或者通过发送信号将其杀死,又或者因为
daemon
进程代码存在bug而异常退出。这些退出一般都是由手工操作或因异常引发的。 在后台执行,并且不与任何控制终端相关联。 即使
daemon
进程是从终端命令行
启动
的,终端相关的信号如SIGINT、SIGQUIT和SI
Linux/Unix社区
23,224
社区成员
74,537
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章