社区
Linux/Unix社区
帖子详情
守护进程(daemon)中启动另一个程序的问题!
zkxz
2004-08-30 09:39:07
如何在守护进程中启动另外一个程序,使的那个程序可以在某个指定的tty中执行?
各位高手指点一下,已经郁闷很久了!谢谢!
...全文
664
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;
}
【Linux】
守护进程
(
Daemon
)的定义,作用,创建流程
守护进程
(
Daemon
)
守护进程
(
Daemon
)1、定义2、作用3、创建流程4、实例参考
守护进程
(
Daemon
) 1、定义
守护进程
是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或循环等待处理某些事件的发生;它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户
程序
提供服务。Linux系统的大多数服务器就是通过
守护进程
实现的。
守护进程
一般在系统
启动
时开始运行,除非强行终止,否则直到系统关机才随之一起停止运行;
守护进程
一般都以root用户权限运行,因为要使用
linux
daemon
(
守护进程
)
什么是
Daemon
Daemon
程序
,又称为
守护进程
,通常在系统后台长时间运行,由于没有控制终端而无法与前台交互。
Daemon
程序
一般作为系统服务使用。Unix/Linux
中
的
daemon
进程类似于Windows
中
的后台服务进程,例如http服务进程nginx,ssh服务进程sshd等。 ps -axj 命令打印系统
中
各进程的状态。 选择项- a显示由其他用户所拥有的进程的状态。 -x显示没有控制终端的进程的状态。 -j显示与作业有关的信息:对话期 ID、进程组ID、控制终端以及终端进程组 ID。 .
daemon
(
守护进程
)
Daemon
Daemon
程序
是一直运行的服务端
程序
,又称为
守护进程
。通常在系统后台运行,没有控制终端不与前台交互,
Daemon
程序
一般作为系统服务使用。
Daemon
是长时间运行的进程,通常在系统
启动
后就运行,在系统关闭时才结束。一般说
Daemon
程序
在后台运行,是因为它没有控制终端,无法和前台的用户交互。
Daemon
程序
一般都作为服务
程序
使用,等待客户端
程序
与它通信。我们也把运行的Daem
Linux
守护进程
daemon
Daemon
程序
简介
Daemon
是长时间运行的进程,通常在系统
启动
后就运行,在系统关闭时才结束。一般说
Daemon
程序
在后台运行,是因为它没有控制终端,无法和前台的用户交互。
Daemon
程序
一般都作为服务
程序
使用,等待客户端
程序
与它通信。我们也把运行的
Daemon
程序
称作
守护进程
。 比如,我们的网络服务
程序
,可以在完成创建套接口,绑定套接口,设置套接口为监听模式后
7.【Orangepi Zero2】
守护进程
daemon
(),将
守护进程
设置为开机
启动
函数创建
守护进程
的时候,要确保你的
程序
适合在后台运行,因为一旦它脱离了终端控制,就不再接收用户输入。函数是用于创建
守护进程
的函数,它在Unix/Linux系统
中
常被使用。为非零值,
守护进程
将不会关闭标准输入、标准输出和标准错误。在调试
程序
的时候,如果遇到像
守护进程
不能将调试的信息用。参数用于指示是否改变
守护进程
的当前工作目录。函数成功创建
守护进程
时返回 0,失败时返回 -1。为非零值,
守护进程
的当前工作目录将保持不变。创建
守护进程
的C
程序
,它将当前时间写入文件。
守护进程
设置为开机自
启动
。
Linux/Unix社区
23,223
社区成员
74,536
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章