linux系统创建进程,Linux下创建进程

简介

在微服务架构下,会涉及到大量的模块,我们需要对这些模块进行批量化的管理,包括模块的启动、监控等工作。

方案一

#include

#include

#include

#include

#include

#include

#include

#include

int main()

{

pid_t pid = 0;

//创建一个子进程,fork()函数没有参数。

pid = fork();

if (pid < 0)

{

std::cout << "error" << std::endl;

}

else if (0 != pid)

{

pause();

}

setsid();

umask(0);

// //关闭文件描述符

int des=getdtablesize();

int i=0;

for(i=0;i<3;i++)

{

close(i);

}

//子进程得到的返回值是0,这段代码在子进程中执行

std::string strTp = "./binname";

execl(strTp.c_str(), strTp.c_str(), "-cmd", "value", nullptr);

return 0;

}

该方法虽然可以正常创建进程,但创建的进程与当前进程存在父子关系,当前进程异常可能会导致子进程异常,所以这种办法并不可取。

方案二

int main()

{

pid_t pid = 0;

//创建一个子进程,fork()函数没有参数。

pid = fork();

if (pid < 0)

{

std::cout << "error" << std::endl;

}

else if (0 != pid)

{

pause();

}

setsid();

umask(0);

//关闭文件描述符

int des=getdtablesize();

int i=0;

for(i=0;i<3;i++)

{

close(i);

}

if ((pid = fork()) < 0)

std::cout << "error" << std::endl;

else if (pid != 0) /* parent */

exit(0);

//子进程得到的返回值是0,这段代码在子进程中执行

std::string strTp = "./binname";

execl(strTp.c_str(), strTp.c_str(), "-cmd", "value", nullptr);

return 0;

}

该方法是在子进程中创建孙进程来作为执行模块,然后子进程退出,孙进程会变成孤儿进程,由系统接管。

方案三

int fnProcess(void *stack)

{

std::tuple<:string std::string> *pArg = static_cast<:tuple std::string> *>(stack);

std::string strTp, strUuid, strServerName;

std::tie(strTp, strUuid, strServerName) = *pArg;

setsid();

//子进程得到的返回值是0,这段代码在子进程中执行

execl(strTp.c_str(), strTp.c_str(), "-u", strUuid.c_str(), "-s", strServerName.c_str(), nullptr);

delete pArg;

return 1;

}

int main()

{

void * stack;

stack = malloc(FIBER_STACK);//为子进程申请系统堆栈

if (!stack)

{

printf("The stack failed\n");

exit(0);

}

std::tuple<:string std::string> *pArg = new std::tuple<:string std::string>(strTp, strUuid, strServerName);

clone(&fnProcess, (char *)stack + FIBER_STACK, CLONE_PARENT, pArg);//创建子线程

}

该方案通过手动分配堆栈,将信息传递给子进程来实现精准控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值