1. execlp函数定义
int execlp(const char *file, const char *arg, ...);
参数说明:
file --文件名称,如果包含“/”,则认为路径名,直接查找程序,否则,从PATH环境变量指定的路径中查找程序。
arg --新程序启动参数,每个arg都是非空的string,参数列表以NULL结束。
2. 问题思路及代码
1)问题
使用execlp向新程序传参时,当参数很多,需要逐个转换成字符串,函数调用冗长繁琐,在新程序中很难区分这些参数的意义。
2)思路
对所有参数进行序列化,将序列化后的字符串传递给新程序;新程序启动后,获取参数并反序列化,得到参数对象。
采用boost库进行序列化。
3)部分代码
processA启动新程序processB,将ProcessExecArgs参数对象序列化后传递给processB:
ProcessExecArgs params;
params._a = 1;
params._b = 2;
params._c = "test";
execlp("processB", params.getSerializedStr().c_str(), (char*)0);
processB的main函数反序列化参数对象:
int main(int argc, char **argv)
{
if(argc < 1)
{
printf("error: argc < 1\n");
return 0;
}
ProcessExecArgs params;
params.initFromSerializedStr(argv[0]);
printf("a:%u, b:%lu, c:%s\n", params._a, params._b, params._c.c_str());
return 0;
}
参数结构体类:ProcessExecArgs
#include <string>
#include <iostream>
#include <sstream>
#include <boost/serialization/access.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/export.hpp>
class ProcessExecArgs
{
public:
uint16_t _a;
uint64_t _b;
std::string _c;
friend class boost::serialization::access;
template <class Archive>
void serialize(Archive &ar, const unsigned int /*version*/)
{
ar &_a;
ar &_b;
ar &_c;
}
std::string getSerializedStr()
{
std::ostringstream archiveStream;
boost::archive::text_oarchive archive(archiveStream);
archive << *this;
return archiveStream.str();
}
void initFromSerializedStr(const std::string &aData)
{
std::istringstream is(aData.c_str());
boost::archive::text_iarchive ia(is);
ia >> *this;
}
};