linux 学习笔记 后台进程运行程序
2014-08-15 16:43
701 查看
#if defined(POE_OS_FAMILY_WINDOWS)
#define PATHSEPRAT
4000
OR '\\'
#else
#define PATHSEPRATOR '/'
#endif
inline string getprocessdir()
{
size_t linksize = 256;
char realpath[256] = {0};
string strdir;
#ifndef WIN32
//可执行文件所在目录
if( readlink("/proc/self/exe", realpath, linksize) != -1 )
#else
if (GetModuleFileNameA(NULL, realpath, (DWORD)linksize))
#endif
{
string strpath = realpath;
strdir = strpath.substr(0, strpath.rfind(PATHSEPRATOR));
}
return strdir;
}
void daemonrun(void)
{
#ifndef WIN32
int pid;
if((pid = fork()) > 0)
{
fprintf(stdout, "[parent process]Info: Forked background with PID: [%d]\n", pid);
exit(0);//是父进程,结束父进程
}
else if(pid < 0)
{
perror ("1st Fork failed\n");
exit(1);//fork失败,退出
}
//是第一子进程,后台继续执行
setsid();// 第一子进程成为新的会话组长和进程组长
//并与控制终端分离
if((pid = fork()) > 0)
{
fprintf(stdout, "[1st child process]Info: Forked background with PID: [%d]\n", pid);
exit(0);//是第一子进 程,结束第一子进程
}
else if(pid < 0)
{
perror ("2nd Fork failed\n");
exit(1);//fork失败,退出
//是第二子进程,继续
//第二子进程不再是会话组长
}
chdir(getprocessdir().c_str());//改变工作目录到/
umask(0);//重设文件创建掩模
fclose(stdin);
fclose(stdout);
fclose(stderr);
#endif
return;
}
#define PATHSEPRAT
4000
OR '\\'
#else
#define PATHSEPRATOR '/'
#endif
inline string getprocessdir()
{
size_t linksize = 256;
char realpath[256] = {0};
string strdir;
#ifndef WIN32
//可执行文件所在目录
if( readlink("/proc/self/exe", realpath, linksize) != -1 )
#else
if (GetModuleFileNameA(NULL, realpath, (DWORD)linksize))
#endif
{
string strpath = realpath;
strdir = strpath.substr(0, strpath.rfind(PATHSEPRATOR));
}
return strdir;
}
void daemonrun(void)
{
#ifndef WIN32
int pid;
if((pid = fork()) > 0)
{
fprintf(stdout, "[parent process]Info: Forked background with PID: [%d]\n", pid);
exit(0);//是父进程,结束父进程
}
else if(pid < 0)
{
perror ("1st Fork failed\n");
exit(1);//fork失败,退出
}
//是第一子进程,后台继续执行
setsid();// 第一子进程成为新的会话组长和进程组长
//并与控制终端分离
if((pid = fork()) > 0)
{
fprintf(stdout, "[1st child process]Info: Forked background with PID: [%d]\n", pid);
exit(0);//是第一子进 程,结束第一子进程
}
else if(pid < 0)
{
perror ("2nd Fork failed\n");
exit(1);//fork失败,退出
//是第二子进程,继续
//第二子进程不再是会话组长
}
chdir(getprocessdir().c_str());//改变工作目录到/
umask(0);//重设文件创建掩模
fclose(stdin);
fclose(stdout);
fclose(stderr);
#endif
return;
}
相关文章推荐
- Linux进程线程学习笔记:运行新程序
- Linux进程线程学习笔记:运行新程序
- Linux系统学习笔记:运行程序
- Linux中如何让进程(或正在运行的程序)到后台运行?
- Linux中如何让进程到后台运行?Linux里面程序一直运行不被中断
- Linux中如何让进程(或正在运行的程序)到后台运行
- Linux中让进程(或正在运行的程序)到后台运行
- Linux 程序设计学习笔记----进程管理与程序开发(下)
- Linux中如何让进程(或正在运行的程序)到后台运行?
- linux 进程学习笔记-运行新进程
- Linux中如何让进程(或正在运行的程序)到后台运行?
- Linux下让进程在后台可靠运行的几种方法(nohup/&)和前后台运行程序切换
- Linux中如何让进程(或正在运行的程序)到后台运行?
- 【Linux学习笔记二十二】init进程与系统运行级别
- linux 守护进程与用&结尾的后台运行程序有什么区别
- (一)OpenCV学习笔记——Linux下编译运行opencv程序
- linux学习笔记----进程管理----杀死进程and 把进程放入后台
- Linux中如何让进程(或正在运行的程序)到后台运行?[zz]
- Linux中如何让进程(或正在运行的程序)到后台运行?
- Linux 程序设计学习笔记----进程管理与程序开发(上)