文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 专题 求职 读书
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» C/C++ » BootServer 4001       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: BootServer 4001  ( 查看:214  回复:1 )   
 该主题悬赏的200无忧币已被全部领完 
 
hdf3598
新新人类  点击可查看详细



帖子 12
精华 0
无忧币 5210
积分 60
阅读权限 20
注册日期 2008-2-3
最后登录 2008-4-14 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-4-13 16:21   标题:BootServer 4001
上一帖 |
我现在要做一个Unix进程管理系统,其中一个功能是,当被监控的进程崩溃以后,进程管理器可以自动重新启动这个程序,(进程管理器是以守护进程的形式出现的)
要重新启动一个进程,必须要做的其中一个步骤,就是要模拟出进程启动时候的环境
譬如说,进程A是用户user_A在 /usr/shacker里面执行 "BootServer 4001"这样的命令得到的,对于进程A来说,工作目录就是/usr/shacker. 当进程A崩溃了,重新启动这个进程,除了要重新执行这个命令"BootServer 4001"以外,按照我的想法,还需要使这个进程工作于/usr/shacker里面
所以我的做法是
int main(){
pid_t pid;
if ((pid=fork())==0)
{
//in child
chdir("崩溃进程的工作目录");//譬如说 /usr/shacker
system("执行崩溃进程的命令行"); //譬如说ls >filelist
}
else
{
}
但发现是不行的,system("执行崩溃进程的命令行")以后,需要重启动的崩溃进程工作目录还是进程监控系统的工作目录,显然是不合理的
怎么解决这个问题呢?thanks



网络虽虚拟,技术无边界,来看看大家“真面目”!
2008-4-13 16:211楼
[ 顶部 ]
 
redking
副版主  点击可查看详细


十二生肖之狗   双鱼座   行业勋章   技术勋章   诚信兄弟   中秋活动勋章  
帖子 2657
精华 0
无忧币 34792
积分 4345
阅读权限 140
来自 (保密)
注册日期 2006-7-11
最后登录 2008-9-5 离线

[查看资料]  [发短消息]  [Blog
[个人主页]    QQ       
发表于:2008-4-13 16:21  该回复被 hdf3598 奖励 200 点无忧币
此回复于2008-04-13 16:22被 hdf3598 评为最佳答案

system("脚本程序");在脚本程序里面想去哪个目录不行啊。
答2:#include <unistd.h>
#include <errno.h>
#include <stdio.h>
int main()
{
switch(fork()) {
case 0:
if(chdir("/tmp")) {
perror("chdir");
exit(1);
}
system("ls >out.txt");
exit(0);
case -1:
exit(1);
default:
exit(0);
}

}
上面的程序在FreeBSD4.2下通过。另外参考:
fork(), getcwd(), getwd(), chdir(), chroot()等函数的man手册。



“绿色IT 从我做起”圈子有奖活动
2008-4-13 16:212楼
[ 顶部 ]
     
论坛跳转:  

| | |

| | |

标记已读 · 删除论坛Cookies · 文本版 · WAP
 
| 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
Copyright©2005-2008 51CTO.COM  Powered by Discuz!
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
京ICP备05051492号