免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ym788083love
打印 上一主题 下一主题

在UNIX C里面如何将一个程序做成后台进程 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-06-21 10:05 |只看该作者

在UNIX C里面如何将一个程序做成后台进程

[quote]原帖由 "mq110"]那你你哪个执行这个程序的终端可以发SIGINT信号 也就是ctrl+c停止它了.算不上精灵进程.[/quote 发表:

在sun上ctrl+c并未停止它

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
12 [报告]
发表于 2005-06-21 10:28 |只看该作者

在UNIX C里面如何将一个程序做成后台进程

加个&只是运行了个后台进程,精灵进程的要求还要更高
sh只是一个程序,提供了一个人机交互的界面,当运行exit或ctrl-D时会退出这个程序,在sh下运行一个程序就是sh fork了一个子进程,在子进程中execl某个程序,然后waitpid等待该程序的运行结束。加了&后,sh fork一个子进程,该子进程再fork一个子进程去execl,然后自已退出,于是sh的waitpid就结束了,看起来就是程序在后台运行了
作为精灵进程必须脱离终端,不然终端的活动会对进程造成不可预料的影响,如退出终端时会给程序发送信号等
精灵进程通过两个fork子进程,使本进程不是会话期的首进程(当一个进程fork一个子进程时,父进程就是会话期的首进程,即终端消息会发送到父进程中,而不是到子进程),从而脱离终端

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
13 [报告]
发表于 2005-06-21 12:35 |只看该作者

在UNIX C里面如何将一个程序做成后台进程

yuxh  大哥说的对.
还有想做精灵进程 就不要偷机取巧

论坛徽章:
0
14 [报告]
发表于 2005-06-22 13:52 |只看该作者

在UNIX C里面如何将一个程序做成后台进程

[quote]原帖由 "mq110"][/quote 发表:


对平台的依赖度太高!不建议使用

论坛徽章:
0
15 [报告]
发表于 2005-06-22 13:55 |只看该作者

在UNIX C里面如何将一个程序做成后台进程

以下代码段摘自《Unix Systems Programming, Communication, Concurrency, and Threads》


  1. Program 3.7 runback.c
  2. The runback program creates a child process to execute a command string in the background.

  3. #include <stdio.h>;
  4. #include <stdlib.h>;
  5. #include <unistd.h>;
  6. #include <sys/wait.h>;
  7. #include "restart.h"

  8. int makeargv(const char *s, const char *delimiters, char ***argvp);

  9. int main(int argc, char *argv[]) {
  10.    pid_t childpid;
  11.    char delim[] = " \t";
  12.    char **myargv;

  13.    if (argc != 2) {
  14.       fprintf(stderr, "Usage: %s string\n", argv[0]);
  15.       return 1;
  16.    }
  17.    childpid = fork();
  18.    if (childpid == -1) {
  19.       perror("Failed to fork");
  20.       return 1;
  21.    }
  22.    if (childpid == 0) {                 /* child becomes a background process */
  23.      if (setsid() == -1)
  24.         perror("Child failed to become a session leader");
  25.      else if (makeargv(argv[1], delim, &myargv) == -1)
  26.         fprintf(stderr, "Child failed to construct argument array\n");
  27.      else {
  28.         execvp(myargv[0], &myargv[0]);
  29.         perror("Child failed to exec command");
  30.      }
  31.      return 1;                                  /* child should never return */
  32.    }
  33.    return 0;                                                 /* parent exits */
  34. }

复制代码


不过如果要实现比较完善的功能的话,还需要增加很多东西。

论坛徽章:
0
16 [报告]
发表于 2005-06-22 17:28 |只看该作者

在UNIX C里面如何将一个程序做成后台进程

是的,同意楼主,最好的方法就是作守护进程,那个daemon函数还真没用过,不知道什么效果,有时间尝试一下(%%)

论坛徽章:
0
17 [报告]
发表于 2005-06-22 17:29 |只看该作者

在UNIX C里面如何将一个程序做成后台进程

(x)

论坛徽章:
0
18 [报告]
发表于 2005-06-22 17:36 |只看该作者

在UNIX C里面如何将一个程序做成后台进程

使用命令  nohup 你的程序  就可以了,man nohup

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
19 [报告]
发表于 2005-06-22 21:34 |只看该作者

在UNIX C里面如何将一个程序做成后台进程

sunlan

昏倒.难道我不知道 daemon是如何实现的吗?

我只是 无意之中发现了一个函数而已. 炫耀一下

论坛徽章:
0
20 [报告]
发表于 2005-06-22 22:10 |只看该作者

在UNIX C里面如何将一个程序做成后台进程

原帖由 "mq110" 发表:
sunlan

昏倒.难道我不知道 daemon是如何实现的吗?

我只是 无意之中发现了一个函数而已. 炫耀一下


我不过是给不清楚的人一个模板而已
同时建议他们注意程序的可移植性
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP