c语言调用脚本后台执行
可能实现方法
c语言如何调用脚本,并让脚本后台执行?
c语言调用系统命令主要有三种方式,
1.popen(建立管道)
2.system()
3.使用vfork()新建子进程
4.使用at命令,交给系统执行
1.popen的方式—-不可行
c代码如下:
backExeShell.c
1 |
|
脚本内容
backExeShell.sh
1 | !/bin/bash |
编译代码
gcc -g backExeShell.c -o backExeShell
执行./backExeShell (注意,脚本和c程序在同一路径)
可以看到c程序暂停,新打开一个终端
执行命令:1
ps -ef | grep backExeShell
可以看到
此时脚本正在执行,这时候,终止c程序,再次执行上面的命令,发现,脚本也终止了。
结论:通过管道的方式调用shell脚本,一旦程序退出,脚本也不再执行,因此不能通过管道的方式通过c语言调用后台执行脚本。
system()方式——可行
1 |
|
c代码如下:
backExeShell_1.c
脚本代码与前面一致。
编译,运行.
使用ps -ef | grep backExeShell命令查看脚本执行进程
发现进程存在,等c程序执行结束后,继续查看脚本执行进程,发现脚本仍然在执行。
结论:通过system方式可调用脚本后台执行。
但是存在一个问题,由于脚本是通过程序调用的,因此脚本会“继承”程序的端口,
也就是说,如果程序有使用端口,而通过这种方式,调用脚本后,杀死程序,
再次启动程序时,会出现端口占用。
交给系统执行(at 命令)
使用系统的at命令
例如:at now <<< “./backExeShell”
但是这种方式又存在另外一个问题,因为该脚本是系统执行的,
也就是说,不存在任何用户,潜在的问题就是,有些命令如果依赖用户
的环境,那么该命令就会执行失败。
结束语:
其他方式不做说明,通过system,并且执行脚本时,使用后台启动,即sh ./shell.sh &(甚至可以 nohup ./shell.sh &)的方式可以实现后台启动。
(./shell.sh 的方式不可行)