如何从Shell脚本调用C程序?C客户端Socket后台化及脚本嵌入问题
问题解答
1. 如何从Shell脚本中调用C程序?
要在Shell脚本里调用C程序,分两步就能搞定:
- 第一步:编译C程序为可执行文件
先用gcc把你的.c源码文件编译成可执行程序,比如你的C文件叫client_socket.c,执行命令:
这会生成一个名为gcc client_socket.c -o client_socketclient_socket的可执行文件(你可以自定义名字)。如果你的Socket程序依赖额外的库(比如多线程库pthread),要把库参数加上,比如:gcc client_socket.c -o client_socket -lpthread - 第二步:在Shell脚本中调用可执行文件
直接在脚本里写入可执行文件的路径即可——如果可执行文件和脚本在同一目录,用./client_socket;如果是放在固定目录(比如/usr/local/),就写绝对路径/usr/local/client_socket。
2. 把C客户端Socket程序整合到你的Bash脚本中
看你的示例脚本,原来的perl socket.pl就是调用外部程序的位置,你只需要把这行替换成你的C可执行文件调用即可,同时我帮你优化了脚本里的PID管理问题(原来的写法会导致停止命令无法正确终止目标进程):
步骤1:编译你的C客户端程序
假设你的C源码文件是client_socket.c,先编译它,然后把生成的可执行文件放到/usr/local/目录下(和脚本里cd /usr/local/的路径对应):
gcc client_socket.c -o /usr/local/client_socket
步骤2:修改你的Bash脚本
把脚本里的perl socket.pl替换成你的C可执行文件调用,同时修正PID写入逻辑:
#!/bin/bash case "$1" in start) rm -f /var/run/alarm.pid # 将循环逻辑放到后台运行,并获取它的PID写入文件 (while true do cd /usr/local/ # 替换成你的C可执行文件调用 ./client_socket sleep 11 done) & # $! 代表最近一个后台进程的PID,写入pid文件 echo $! >> /var/run/alarm.pid ;; stop) kill -9 $(cat /var/run/alarm.pid) rm -f /var/run/alarm.pid echo stop exit 0 ;; esac exit 0
额外提示:让程序脱离终端后台运行
如果想让程序在你关闭终端后依然保持运行,可以在后台运行的循环前加上nohup,修改后的循环部分如下:
nohup (while true do cd /usr/local/ ./client_socket sleep 11 done) &
内容的提问来源于stack exchange,提问作者mery
相关产品推荐
相关产品推荐

