调度程序的实现

该博客介绍了一个C语言程序,用于启动并周期性执行指定的子程序。程序首先关闭信号和IO,然后通过fork创建子进程,子进程在父进程退出后由系统接管,持续运行。它会捕获SIGCHLD信号,等待子进程结束,然后在设定的时间间隔后重启子程序。此实现适用于需要定期执行任务的场景。
摘要由CSDN通过智能技术生成

用一个程序启动另一个程序,并实现周期性执行服务程序。
思路:
在这里插入图片描述

procectl执行完后退出,子进程被1号进程接管,运行在后台。
在这里插入图片描述

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<string.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{

  if(argc<3)
  {
    printf("Using:./procctl timetvl program argvs ...\n");
    printf("Example:/project/tools1/bin/procctl 5 /usr/bin/tar zcvf /tmp/tmp.tgz /usr/include\n\n");
    printf("timetvl 运行周期,单位:秒。被调度的程序运行结束后,在timetvl秒后会被procctl重新启动。\n");
    printf("program 被调度的程序名,必须使用全路径。\n");
    printf("argvs 被调度的程序的参数。\n");
    printf("注意,本程序不会被kill杀死,但可以用kill -9强行杀死。\n\n\n");
    return -1;
  }

  // 关闭信号和IO,本程序不希望被打扰
  // 信号的取值是64,关信号和关io用了同一个循环,实际上io并没有64那么多,只有0、1、2,但是,代码这么写也没有问题,没必要再用一个循环。
  for(int ii=0;ii<64;ii++)
  {
    signal(ii,SIG_IGN); close(ii);
  }

  // 分叉了,生成子进程继续往后执行代码,父进程退出,让程序运行在后台,由系统1号进程托管。(子进程变成孤儿进程, 其父进程变为1号进程)
  if (fork()!=0) exit(0);

  // 启用SIGCHLD信号,让父进程可以wait子进程退出的状态。
  signal(SIGCHLD,SIG_DFL);

  char *pargv[argc];
  for(int ii=2;ii<argc;ii++)
    pargv[ii-2] = argv[ii];
 
  pargv[argc-2] = NULL;

  while(true)
  {
    if(fork()==0)
    {
      execv(argv[2],pargv);  // 执行成功,就去执行别的进程,后面代码不执行
      exit(0); // 如果execv执行失败就退出
    }
    else 
    {
      int status;
      wait(&status);
      sleep(atoi(argv[1]));
    }
  }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值