第一个问题:c/c++中调用外部程序
在写程序的时候难免会遇到需要调用外部程序或别人写好的可执行文件,当编程工具为c/c++时,通过使用system()函数,或exec家族函数可实现对外部可执行文件的调用。如果使用execlp()函数,会出现一个问题,那便是当execlp()函数调用结束时,后面的代码也不再执行。该问题可通过fork函数创建子进程解决 。而且system()函数本身就是通过fork子进程的方式实现对外部程序的调用。
第二个问题:计算所调用程序的运行时间
为了测试该外部程序对不同数据处理时间的长短,需要计算该程序的运行时间,但是如果通过上面提到的c语言中的函数创建子进程,统计时间总是出现不正确,自己调试了一下午也没有成功。后来又看了fork子进程相关的资料,觉得应该是子进程与父进程同时执行的缘故。但是问题又来了,如果将时间结点程序放到子进程中,那么execlp函数结束后仍然不会执行时间结点的程序,若将时间结点程序放到父进程,那么父进程与子进程是同时进行的,仍然无法捕获子进程的运行时间。后来又尝试了将父进程阻塞,单独执行子进程等等尝试,仍然不成功。
由于自己只是需要计算调用外部程序处理数据所需的时间,因此,想到可以利用bash脚本调用的方式。bash脚本程序如下:
1 #!/bin/bash 2 BEGIN_TIME=`date +%H:%M:%S` 3 #设置输入点集 4 DATA_NAME=../../test_data/input/dragon-1.5M.asc 5 ./src/cocone-linux $DATA_NAME 6 echo
7 echo
8 END_TIME=`date +%H:%M:%S` 9 echo "程序开始时间为"
10 echo "$BEGIN_TIME"
11 echo "程序结束时间为"
12 echo "$END_TIME"
13 echo "开始OFF 到 STL 数据转换"
14 python ./src/trans_off_to_stl.py $DATA_NAME.jv 15 rm -rf $DATA_NAME.jv 16 rm -rf $DATA_NAME.dl
linux下,date指令可获取系统时间,后面为设置的时间格式。
其中BEGIN_TIME 变量存储程序开始运行时系统时间。END_TIME 变量存储程序结束时系统时间。
一个简单的脚本实现了调用外部程序,计算外部程序运行的功能。