用execv从c++中启动一个服务
Launching a service from c++ with execv
我正在尝试从c++启动linux服务,我成功地做到了,但我的一个进程被标记为"defunct",我不希望我的父进程死亡。
我的代码是(testRip.cpp):
int main()
{
char* zebraArg[2];
zebraArg[0] = (char *)"zebra";
zebraArg[1] = (char *)"restart";
char* ripdArg[2];
ripdArg[0] = (char *)"ripd";
ripdArg[1] = (char *)"restart";
pid_t ripPid;
pid_t zebraPid;
zebraPid = fork();
if(zebraPid == 0)
{
int32_t iExecvRes = 0;
iExecvRes = execv("/etc/init.d/zebra", zebraArg);
return 0;
if(iExecvRes == -1)
{
::syslog((LOG_LOCAL0 | LOG_ERR),
"zebra process failed n");
}
}
else
{
while(1)
{
::syslog((LOG_LOCAL0 | LOG_ERR),
"runningn");
sleep(2);
}
}
}
ps -e命令的出口为:
9411 pts/1 00:00:00 testRip
9412 pts/1 00:00:00 testRip <defunct>
9433 ? 00:00:00 zebra
/etc/init.d/zebra将服务作为守护进程或类似的东西启动,所以我认为这是一个技巧,但是:
为什么有3个进程,其中一个被标记为失效?我的代码有什么问题?我该怎么修理它?
要删除僵尸,父进程必须将其子进程wait()
或死亡。如果你需要一个非阻塞的wait()
,看看W_NOHANG
标志的waitpid()
。
在Unix和Linux中正确地fork一个守护进程是很困难的,因为有很多细节需要正确处理,而且顺序也很重要。在这种情况下,我怀疑是打开文件描述符的组合,而不是分离控制终端。
我强烈建议使用其他程序中经过良好调试的实现——一个功能较弱的命令行shell(如rsh或ksh)可能是一个不错的选择,而不是尝试编写自己的版本。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- OpenCV作为一个web服务
- 我的 linux 应用程序端口在停止时被另一个服务占用
- 我可以将一个可执行文件与另一个可执行文件(Windows 服务程序)组合在一起,并将该程序作为逻辑服务运行吗?
- 是否可以创建一个服务或应用程序,以编程方式在windows中登录用户
- 如何在C++中创建一个web/wcf服务客户端
- C++让Windows服务启动另一个程序
- 如何将多个gsoap客户端web服务编译成一个可执行文件
- 在局域网中启动一个服务;未知服务器地址的情况
- 有可能用cygwin编译一个windows服务吗?
- Visual studio项目模板,在c++中创建一个windows服务
- 在c++中使用StartService启动一个服务应用程序
- 用execv从c++中启动一个服务
- 在Windows上通过Live555服务一个实时的OpenCV H.264流
- 如何创建一个可以被任何网站使用的C++ Web 服务
- 我可以在服务中有一个COM接口从Windows脚本主机调用
- 如何实现WebSocket服务器一次只服务一个客户端
- 构建一个卷影服务应用程序发布