c语言调用脚本后台执行

c语言调用脚本后台执行

可能实现方法

c语言如何调用脚本,并让脚本后台执行?
c语言调用系统命令主要有三种方式,
1.popen(建立管道)
2.system()
3.使用vfork()新建子进程
4.使用at命令,交给系统执行

1.popen的方式—-不可行

c代码如下:
backExeShell.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
#include<stdlib.h>
int main()
{
//建立管道,并后台执行脚本
FILE *pp = popen(" sh ./backExeShell.sh &","r");
if(!pp)
{
printf("pp");
}
pclose(pp);
//让程序休眠
sleep(10);
printf("good bye");
return 0;
}

脚本内容
backExeShell.sh

1
2
3
4
#!/bin/bash
echo "shell start!"
sleep 50
echo "finished"

编译代码
gcc -g backExeShell.c -o backExeShell
执行./backExeShell (注意,脚本和c程序在同一路径)

可以看到c程序暂停,新打开一个终端
执行命令:

1
ps -ef | grep backExeShell

可以看到
此时脚本正在执行,这时候,终止c程序,再次执行上面的命令,发现,脚本也终止了。

结论:通过管道的方式调用shell脚本,一旦程序退出,脚本也不再执行,因此不能通过管道的方式通过c语言调用后台执行脚本。

system()方式——可行

1
2
3
4
5
6
7
8
9
#include<stdio.h>
#include<stdlib.h>
int main()
{
system("sh ./backExeShell.sh &");
sleep(10);
printf("good bye");
return 0;
}

c代码如下:
backExeShell_1.c

脚本代码与前面一致。

编译,运行.
使用ps -ef | grep backExeShell命令查看脚本执行进程
发现进程存在,等c程序执行结束后,继续查看脚本执行进程,发现脚本仍然在执行。

结论:通过system方式可调用脚本后台执行。

但是存在一个问题,由于脚本是通过程序调用的,因此脚本会“继承”程序的端口,
也就是说,如果程序有使用端口,而通过这种方式,调用脚本后,杀死程序,
再次启动程序时,会出现端口占用。

交给系统执行(at 命令)

使用系统的at命令

例如:at now <<< “./backExeShell”

但是这种方式又存在另外一个问题,因为该脚本是系统执行的,
也就是说,不存在任何用户,潜在的问题就是,有些命令如果依赖用户
的环境,那么该命令就会执行失败。

结束语:

其他方式不做说明,通过system,并且执行脚本时,使用后台启动,即sh ./shell.sh &(甚至可以 nohup ./shell.sh &)的方式可以实现后台启动。
(./shell.sh 的方式不可行)

守望 wechat
关注[编程珠玑]获取更多原创技术文章
出入相友,守望相助!