【Linux】execlp通过结构体传参

1 篇文章 0 订阅

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;
  }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值