请教 fork(), setsid()问题。

kpman 2009-06-16 03:56:33
void daemon_setup()
{
int fd;



if( getppid() != 1 ) //这是啥意思? {
signal( SIGTTOU, SIG_IGN );
signal( SIGTTIN, SIG_IGN );
signal( SIGTSTP, SIG_IGN );

switch ( fork() )
{
case 0:
/* child continues */
break;
case -1:
/* error exit */
exit(1);
break;
default:
/* parent terminates */
exit(0);
break;
}
/* become session leader and group process leader */
setsid(); //这又是啥意思
}

/*这是个循环啥意思*/
for( fd = 0; fd < 64; fd++ )

close( fd );


return;
...全文
1264 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kpman 2009-06-18
  • 打赏
  • 举报
回复
??
kpman 2009-06-18
  • 打赏
  • 举报
回复
参数不一样会导至什么样的结果?
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kpman 的回复:]
exit(0) 跟 exit(1) 有什么不同?
[/Quote]

退出的参数不一样,很明显啊
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kpman 的回复:]
是的 楼主的例子不错。。不过还是有好多问题呢。

在什么情况下 getpid() == 1 ?
[/Quote]

当它的pid确实是1,也就是1号进程的时候。
kpman 2009-06-17
  • 打赏
  • 举报
回复
exit(0) 跟 exit(1) 有什么不同?
kpman 2009-06-17
  • 打赏
  • 举报
回复
是的 楼主的例子不错。。不过还是有好多问题呢。

在什么情况下 getpid() == 1 ?
  • 打赏
  • 举报
回复

void daemon_setup()
{
int fd;



if( getppid() != 1 ) //这是啥意思? // 这是获取父进程ID啊,看意思都知道啊
{
signal( SIGTTOU, SIG_IGN );
signal( SIGTTIN, SIG_IGN );
signal( SIGTSTP, SIG_IGN );

switch ( fork() )
{
case 0:
/* child continues */
break;
case -1:
/* error exit */
exit(1);
break;
default:
/* parent terminates */
exit(0);
break;
}
/* become session leader and group process leader */
setsid(); //这又是啥意思。 //让该进程成为会话组长和进程组长
}

/*这是个循环啥意思*/
for( fd = 0; fd < 64; fd++ ) //关闭该进程的文件描述符

close( fd );


return;


建议你看看守护进程的生成过程,就不会有这么多问题了。

http://blog.csdn.net/hairetz/archive/2009/05/17/4195036.aspx
Treazy 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kpman 的回复:]
if( getppid() != 1 ) 为什么一定要设这样的条件呢???
[/Quote]

父进程退出后,子进程就变成了孤进程,从而被Init进程领养,而Init的进程ID为1
这里是为了过滤孤进程的情形
kpman 2009-06-16
  • 打赏
  • 举报
回复
if( getppid() != 1 ) 为什么一定要设这样的条件呢???
dl591944556 2009-06-16
  • 打赏
  • 举报
回复
getppid() 返回调用进程的父进程ID
setsid() 创建会话并设置进程组ID


for( fd = 0; fd < 64; fd++ )

close( fd );

程序混乱,是不是截下来的代码太少了,fork不像fork,看不懂
望高人能看懂
Treazy 2009-06-16
  • 打赏
  • 举报
回复

getppid():返回调用进程的父进程ID
setsid(): 创建会话并设置进程组ID
amossavez 2009-06-16
  • 打赏
  • 举报
回复
fork函数创建一个新进程,由fork创建的新进程被称为子进程
getppid返回父进程标识
setsid()就是将进程和它当前的对话过程和进程组分离开,并且把它设置成一个新的对话过程的领头进程
内容概要:本文提出了一种基于蒙特卡洛模拟与拉格朗日松弛法相结合的分散式优化方法,用于解决电动汽车充电站在分时电价机制下的有序充电调度问题。通过构建考虑用户充电需求与电网负荷平衡的优化模型,利用拉格朗日松弛法处理多车充电之间的耦合约束,实现去中心化的决策过程;同时引入蒙特卡洛方法模拟用户充电行为的不确定性,提升调度策略的鲁棒性。该方法有效降低了电网负荷峰谷差,提高了充电经济性与系统运行效率,为大规模电动汽车接入提供了可行的调度解决方案。; 适合人群:具备电力系统优化基础和Matlab编程能力的研究生、科研人员,以及从事智能电网、电动汽车能源管理等相关领域的工程技术人员。; 使用场景及目标:①应用于城市充电站集群的运营调度,实现削峰填谷与成本优化;②支撑电力系统需求侧管理研究,评估分时电价政策对用户充电行为的引导效果;③为多主体参与的分散式能源管理系统提供算法参考与仿真验证工具。; 阅读建议:建议读者结合提供的Matlab代码深入理解拉格朗日乘子迭代更新机制与蒙特卡洛场景生成流程,重点分析算法收敛性与不同电价策略下的调度结果差异,可通过调整用户数量、充电功率等参数进行仿真实验,以掌握模型的实际应用特性。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧