当前位置: 技术问答>linux和unix
Linux下,如何在程序中实现后台运行
来源: 互联网 发布时间:2016-11-05
本文导语: 本帖最后由 paodan 于 2011-01-14 16:58:10 编辑 Linux下 现有一个 test.c程序, #include int main(int argc,char **argv) { ... return 1; } 编译连接后,生成test文件,当从外部接收到某个参数(-n)后,就让test在后台执行,效果...
#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);
daemon - run in the background
SYNOPSIS
#include
int daemon(int nochdir, int noclose);
|
可以通过文件锁的方式
进程启动前,首先尝试锁定一个文件,如果成功,继续
如果失败,表示另外一个进程正在运行,退出
这样可以确保只启动一个实例
进程启动前,首先尝试锁定一个文件,如果成功,继续
如果失败,表示另外一个进程正在运行,退出
这样可以确保只启动一个实例
|
所谓的后台运行关键是如下几个操作:
1、避免成为init的子进程。---也叫僵尸进程
2、关闭标准输入输出。
3、关闭所有的文件操作的继承性。
简单来说,就是你的进程即使是死循环,也不妨碍其他进程敲键盘。
所以守护进程一般都是一个僵尸进程(父进程退出,子进程继续)
在子进程中关闭所有的文件以及标准输入输出,就变成静悄悄的进程了。
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); //父进程退出
}
如果还需要实现其他一些复杂的要求,则实现一个“守护进程”。
{
//后台运行,这里怎么实现?
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 &
./test &
再写个shell脚本,根据不同的参数,执行./test或./test &
|
...
if(!strcmp(argv[1],"-a"))
{
//后台运行,这里怎么实现?
daemon(0,0); server();
return 1;
...
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;
...
这样不会切换当前路径,也不会关闭文件描述符
if(!strcmp(argv[1],"-a"))
{
//后台运行,这里怎么实现?
daemon(1,1);
server();
return 1;
...
这样不会切换当前路径,也不会关闭文件描述符