外部程序(可执行文件)调用的一些问题

第一个问题: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 变量存储程序结束时系统时间。

  一个简单的脚本实现了调用外部程序,计算外部程序运行的功能。

时间: 2024-10-09 08:21:30

外部程序(可执行文件)调用的一些问题的相关文章

QProcess与外部程序的调用(可以通过设置管道来交互)

项目做到一定阶段,经常需要在原来的工程上调用外部程序.Qt为此提供了QProcess类,QProcess可用于完成启动外部程序,并与之交互通信. 一.启动外部程序的两种方式:(1)一体式:void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)外部程序启动后,将随主程序的退出而退出.(2)分离式:void QProcess::startDet

Qt技巧:QProcess与外部程序的调用

项目做到一定阶段,经常需要在原来的工程上调用外部程序.Qt为此提供了QProcess类,QProcess可用于完成启动外部程序,并与之交互通信. 一.启动外部程序的两种方式: (1)一体式:void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite) 外部程序启动后,将随主程序的退出而退出. (2)分离式:void QProcess::start

深入了解以太坊虚拟机第4部分——ABI编码外部方法调用的方式

在本系列的上一篇文章中我们看到了Solidity是如何在EVM存储器中表示复杂数据结构的.但是如果无法交互,数据就是没有意义的.智能合约就是数据和外界的中间体. 在这篇文章中我们将会看到Solidity和EVM可以让外部程序来调用合约的方法并改变它的状态. "外部程序"不限于DApp/JavaScript.任何可以使用HTTP RPC与以太坊节点通信的程序,都可以通过创建一个交易与部署在区块链上的任何合约进行交互. 创建一个交易就像发送一个HTTP请求.Web的服务器会接收你的HTTP

C# 调用APlayer教程

APlayer介绍 引擎介绍: APlayer 媒体播放引擎是迅雷公司从 2009 年开始开发的通用音视频媒体文件播放内核. 迅雷看看播放器和迅雷影音就是使用 APlayer 作为播放内核,目前迅雷看看播放器在PC播放器市场占有率排第一. 本质上APlayer播放引擎是一个ActiveX控件,可以被本地其他外部程序嵌入调用,也可以直接被网页嵌入,类似于(Adobe Flash Player).APlayer不包含界面,但另一个依赖于APlayer的ActiveX控件APlayerUI可以提供丰富

初学者第二季

第一章 C#语言基础本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序和Web应用程序.当然仅靠一章的内容就完全掌握C#语言是不可能的,如需进一步学习C#语言,还需要认真阅读有关C#语言的专著.1.1 C#语言特点Microsoft.NET(以下简称.NET)框架是微软提出的新一代Web软件开发模型,C#语言是.NET框架中新一代的开发工具.C#语言是一种现代.面向对象的语言,它简化了C++语言在类.命名空间.方法

LinkedList的分析

一.源码解析 1. LinkedList类定义. public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作.LinkedList 实现 Li

plsql的程序包package

9. 程序包--PACKAGE 9.1 包的定义和编译 包:一个PLSQL相关对象的逻辑分组和单个对象存储在数据库对象中的数据单元.相关的PLSQL对象包括:常量.变量.游标.异常.SP.FUN 包由两部分组成: 规范部分(包头.调用接口)  +  主体部分(包体.实现部分) (1) 包头的创建: create or replace package org_Master is     max_sites_for_an_org number;    type rc is ref cursor;  

使用BusyBox制作根文件系统

1.BusyBox简介 BusyBox 是很多标准 Linux 工具的一个单个可执行实现.BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大.更复杂的工具,例如 grep.find.mount 以及 telnet:有些人将 BusyBox 称为 Linux 工具里的“瑞士军刀”. BusyBox 揭露了这样一个事实:很多标准 Linux 工具都可以共享很多共同的元素.例如,很多基于文件的工具(比如 grep 和 find)都需要在目录中搜索文件的代码.当这些工具被

WCF--建立简单的WCF服务

在VS2010里建立一个最简单的WCF服务,基本流程如下: 一:新建WCF应用 首先,新建一个WCF服务的应用,如下图所示 建立完成之后,VS将自动生成一个最简单的WCF工程,在这个应用中,包含了最基本Contract.Service. 工程如下: 不需要编辑任何文件,直接编译生成,得到一个WcfService1.dll文件 二.WCF应用中的契约(Contract) 在生成的WCF工程中,IService1.cs中为Contract(本例中契约和服务放在同一个工程下了,实际上也可以分为两个工程

linux-man命令中的编号含义(包括系统调用和库函数讲解)

博文说明[前言]: 本文将通过个人口吻介绍linux的man命令中的编号含义(包括系统调用和库函数解释),在目前时间点[2017年6月13号]下,所掌握的技术水平有限,可能会存在不少知识理解不够深入或全面,望大家指出问题共同交流,在后续工作及学习中如发现本文内容与实际情况有所偏差,将会完善该博文内容. 本文参考文献引用链接: 1.http://www.cnblogs.com/chao1118/p/3715523.html2.http://blog.csdn.net/high_high/artic