C语言fork启进程用exec执行脚本程序

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

static int my_popen(const char *cmd, char *out, int len)
{
    int ret;
    FILE *stream;
    memset(out, 0, len);
    stream = popen(cmd, "r");
    ret = fread(out, sizeof(char), len, stream);
    pclose(stream);
    return ret;
}

static int check_rjservice()
{
    char test[256];   
    pid_t pid;
    int stat = 0;

    while(1){
        memset(test, 0, sizeof(test));

        my_popen("ps -ef | grep '/sbin/Test/test.sh' | grep -v 'grep' ", test, sizeof(test));
        //printf("%s\n", test);

        if(test[0] == 0) {
            printf("test.sh NOT RUNNING\n");
            pid = fork();
            switch(pid)
            {
            case -1:
                perror("fork failed");
                break;
            case 0:
                // 这是在子进程中,调用execlp切换为ps进程
                printf("child\n");
                prctl(PR_SET_NAME, "child", NULL, NULL, NULL);
                execlp("bash","bash","/sbin/Test/test.sh", 0);
                //my_popen("sh /sbin/Test/test.sh &", test, sizeof(test));
                //system("sh /sbin/Test/test.sh &");
                break;
            default:
                pid = wait(&stat);
                printf("Child has finished: PID = %d\n", pid);
                //检查子进程的退出状态
                if(WIFEXITED(stat))
                    printf("Child exited with code %d\n", WEXITSTATUS(stat));
                else
                    printf("Child terminated abnormally\n");
                printf("Parent, \n");
                break;
            }
            
        } else {
            printf("test.sh RUNNING\n");
        }
        sleep(3);
    }
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值