linux下实现后台运行方法,Linux下,如何在程序中实现后台运行

本帖最后由 paodan 于 2011-01-14 16:58:10 编辑

Linux下 现有一个 test.c程序,

#include

int main(int argc,char **argv)

{

...

return 1;

}

编译连接后,生成test文件,当从外部接收到某个参数(-n)后,就让test在后台执行,效果和使用nohup命令一样,如何在程序中实现。

|

NAME

daemon - run in the background

SYNOPSIS

#include

int daemon(int nochdir, int noclose);

|

可以通过文件锁的方式

进程启动前,首先尝试锁定一个文件,如果成功,继续

如果失败,表示另外一个进程正在运行,退出

这样可以确保只启动一个实例

|

所谓的后台运行关键是如下几个操作:

1、避免成为init的子进程。---也叫僵尸进程

2、关闭标准输入输出。

3、关闭所有的文件操作的继承性。

简单来说,就是你的进程即使是死循环,也不妨碍其他进程敲键盘。

所以守护进程一般都是一个僵尸进程(父进程退出,子进程继续)

在子进程中关闭所有的文件以及标准输入输出,就变成静悄悄的进程了。

|

《UNIX环境高级编程》中有一章是讲在后台运行的守护进程的,可以看一下。

|

if(!strcmp(argv[1],"-a"))

{

//后台运行,这里怎么实现?

server();

return 1;

}

------------------------------------

1、最简单的方式:关闭标准输入、输出。

close(0);

close(1);

close(2);

server(); ----- 关闭标准输入输出之后,再运行你的程序,这样你程序内部的printf之类的都无效了。

这个方式就会让你的进程不会霸占输入了,从表面上看,你的程序“后台”了。

但是注意:这个方法实现的后台程序,如果是在ssh或者telnet之类的终端上启动的时候,如果你关闭了ssh,则你的程序也退出了。因为你的程序还是init进程的子进程。

如果不希望ssh退出,你的进程退出,则需要实现一个最简单的“僵尸进程”。

if( fork() == 0)

{

server(); //子进程中跑你的程序

}

else

{

exit(0);   //父进程退出

}

如果还需要实现其他一些复杂的要求,则实现一个“守护进程”。

|

如果你没什么特别要求,用&启动也行的,这样

./test &

再写个shell脚本,根据不同的参数,执行./test或./test &

|

...

if(!strcmp(argv[1],"-a"))

{

//后台运行,这里怎么实现?

daemon(0,0);  server();

return 1;

...

|

对的。。。

./test,使用ps -ef查看

./test -n运行

存在./test

|

楼上的貌似理解错了,楼主的意思是接收到某个参数才启动test在后台执行~~~

|

再开个线程应该也行吧。用信号量同步。

|

看守护进程的生成过程就知道了。

|

...

if(!strcmp(argv[1],"-a"))

{

//后台运行,这里怎么实现?

daemon(1,1);

server();

return 1;

...

这样不会切换当前路径,也不会关闭文件描述符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值