当前位置:  技术问答>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在后台执行,效果...

本帖最后由 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;
...
这样不会切换当前路径,也不会关闭文件描述符

    
 
 

您可能感兴趣的文章:

  • 求意见如何在linux的应用软件中实现一个cpu调度框架,使得多个cpu调度算法可以在同一个系统中实现无缝整合?(分数不够还能再加)
  • LINUX中实现单实例功能使用哪种IPC好啊?
  • 如何在linux中实现局域网上网
  • 如何在linux线程中实现windows下PostThreadMessage的功能
  • 如何在linux中实现例如c# 中arraylist 和sortlist
  • [求助]Linux下如何在Shell Script中实现在某特殊时间点,批量执行脚本指令?(在线等回复)
  • linux中怎么使后台进程的输出至控制终端?
  • 如何停止Linux的后台服务
  • 关于Linux后台进程【nohup】
  • Linux如何将后台进程调到前台来
  • linux下如何暂停后台运行的程序
  • 请教!关于linux下的后台程序的开发。
  • 找啊,找朋友,找到一个好朋友。。。(linux后台开发)
  • 刚开始用linux写程序,问个简单的后台运行问题
  • 菜鸟求助:Linux 应用程序后台启动后关闭窗口程序退出
  • Linux后台压缩命令
  • Linux 开发一个后台运行服务
  • linux后台运行程序问题
  • linux后台运行程序的问题
  • linux shell脚本不重复在后台运行,急急急
  • linux 下后台进程的编写
  • 后台服务开发库 Linux sails
  • linux c++服务器后台开发要学些什么?(介绍点书)
  • linux下如何做一个程序在后台运行.
  • linux如何向后台终端shell当前光标处送入字符串
  • 应届生咨询关于linux后台开发~~
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • 嵌入式linux开发:一段代码在windows平台用VC编译运行正常,在linux平台用gcc编译运行正常,但是用arm-linux-gcc编译在嵌入式板子上运行就不正常.
  • 弱弱地问,能否让WINDOWS下自动运行的多媒体光盘在LINUX下也自动运行播放(LINUX下可一看到光盘上文件)
  • 我的linux程序 如何 在pc机器上运行。现在我用arm-linux-g++ 编译后的程序在我的嵌入设备上运行。
  • 程序在windows下用visual运行正常,如何才能在linux下运行??
  • 怎样让linux启动后不运行桌面而是直接运行某个应用程序呢?
  • Linux下的程序是在内存中运行的吗?为什么在程序运行的时候可以删除程序文件?
  • linux编写一个脚本判断程序是否在运行,如果没运行就重启这个软件。
  • 请问如何让Linux 0.11运行?它运行后是怎样的?谢谢!!
  • 新手提问:grep在linux中运行跟在php运行返回结果不一样
  • Linux开关机时想让脚本运行却运行不了?
  • 谁有linux?帮我用在linux运行两个文件好吗?
  • linux环境下,java程序手工运行不乱码,crontab自动运行就乱码
  • vmware怎么优化?在vmware上装linux运行起来是不是特别慢?我在256内存的p4上安装,运行起来很慢!
  • LINUX 下使用QT开发的程序如何才能让它在没有安装QT的Linux系统下运行?
  • 请问在高版本linux编译链接的程序如何在低版本Linux上运行
  • linux运行级别
  • 我在linux下安装了linux版的realone,但却没法找到如何运行。
  • 在Linux Shell scripts下变量如何取linux的命令运行值
  • 请问如何在linux下运行windows游戏?
  • 在linux中什么叫运行级别
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3