社区
Linux/Unix社区
帖子详情
守护进程(daemon)中启动另一个程序的问题!
zkxz
2004-08-30 09:39:07
如何在守护进程中启动另外一个程序,使的那个程序可以在某个指定的tty中执行?
各位高手指点一下,已经郁闷很久了!谢谢!
...全文
622
15
打赏
收藏
守护进程(daemon)中启动另一个程序的问题!
如何在守护进程中启动另外一个程序,使的那个程序可以在某个指定的tty中执行? 各位高手指点一下,已经郁闷很久了!谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zkxz
2004-09-07
打赏
举报
回复
为什么没人回答了?yanghuajia(newperson)在不在?
zkxz
2004-09-04
打赏
举报
回复
没有人写过类似的程序吗?
zkxz
2004-08-31
打赏
举报
回复
yanghuajia(newperson),救命啊!
第二次给的代码不行啊!加到我的守护进程中,一启动,就登出,而且按键也没响应!
yanghuajia
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
一切正常
yanghuajia
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
一切正常
yanghuajia
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),
谢谢你先!我的确非要做这个工作。我明天会试试上面的代码。
再次感谢!
yanghuajia
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;
}
yanghuajia
2004-08-30
打赏
举报
回复
最简单的方法 据说是
kill -SIGSTOP 13210(对应的控制终端进程ID)
做完你的事情
kill -SIGCONT 13210(对应的控制终端进程ID)
yanghuajia
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去掉了也这样,这是怎么回事呢?
请高手指点迷津!
yanghuajia
2004-08-30
打赏
举报
回复
很麻烦。要做很多保存和恢复工作。上面的例子只是刚好完成你的工作要求
yanghuajia
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;
}
新版应对实际开发的虚拟化技术Docker教程
一个
完整的Docker有以下几个部分组成: DockerClient客户端 Docker
Daemon
守护进程
Docker Image镜像 DockerContainer容器 本教程老师通过图文解析和原理剖析、逐步深入的方式对Docker进行讲授,理论和实践...
创建
一个
守护进程
(
Daemon
进程)
守护进程
也叫
Daemon
进程(
Daemon
翻译过来就是 后台
程序
的意思)。所以简单的来说
守护进程
是
一个
在后台运行并且不受任何终端控制的进程。是生存期长的一种进程,没有控制终端。它们常常在系统引导装入时
启动
,仅在系统关闭时才终止。
daemon
(
守护进程
)
Daemon
Daemon
程序
是一直运行的服务端
程序
,又称为
守护进程
。通常在系统后台运行,没有控制终端不与前台交互,
Daemon
程序
一般作为系统服务使用。
Daemon
是长时间运行的进程,通常在系统
启动
后就运行,在系统关闭时才结束。一般说
Daemon
程序
在后台运行,是因为它没有控制终端,无法和前台的用户交互。
Daemon
程序
一般都作为服务
程序
使用,等待客户端
程序
与它通信。我们也把运行的Daem
守护进程
Daemon
守护进程
,也就是通常所说的
Daemon
进程,是Linux
中
的后台服务进程。周期性的执行某种任务或等待处理某些发生的事件。Linux系统有很多
守护进程
,大多数服务都是用
守护进程
实现的。比如:像我们的tftp,samba,nfs等相关服务。
如何使
一个
进程变成
daemon
进程(
守护进程
)?
daemon
进程又被称为
守护进程
,一般来说它有以下两个特点: 生命周期很长 一旦
启动
,正常情况下不会终止,一直运行到系统退出。但凡事无绝对:
daemon
进程其实也是可以停止的,如很多
daemon
提供了stop命令,执行stop命令就可以终止
daemon
,或者通过发送信号将其杀死,又或者因为
daemon
进程代码存在bug而异常退出。这些退出一般都是由手工操作或因异常引发的。 在后台执行,并且不与任何控制终端相关联。 即使
daemon
进程是从终端命令行
启动
的,终端相关的信号如SIGINT、SIGQUIT和SI
Linux/Unix社区
23,110
社区成员
74,506
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章