📄 main.cpp.bak
字号:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#ifdef _WIN32
#include <process.h>
#include <windows.h>
#else
#include <unistd.h>
#include <signal.h>
#include <sys/stat.h>
#endif
#include "ProcGuard.h"
using namespace std;
void initLinuxGuard()
{
// [1]
signal(SIGTTOU,SIG_IGN); // 后台进程写控制终端
signal(SIGTTIN,SIG_IGN); // 后台进程读控制终端
signal(SIGHUP ,SIG_IGN); // 后台进程终端挂起
signal(SIGTSTP,SIG_IGN); // 进程组长退出时向所有会议成员发出的
// 防止在进入后台之前出现以外.
printf("initLinuxGuard()1...\n");
// [2]
int pid = fork();
if( pid > 0)
exit(0); //是父进程,结束父进程
else if(pid< 0)
exit(1); //fork失败,退出
// [3]
// @@@@@@@@@@@@@@是第一子进程,后台继续执行
setsid(); //第一子进程成为新的会话组长和进程组长并与控制终端分离
printf("initLinuxGuard()2...\n");
// [4]
pid = fork();
if( pid > 0 )
exit(0); //是第一子进程,结束第一子进程
else if(pid< 0)
exit(1); //fork失败,退出
// @@@@@@@@@@@@@@是第二子进程,其不再是会话组长,可以继续执行
printf("initLinuxGurad()3...\n");
// [5]
//关闭打开的文件描述符
int szfdTable = getdtablesize();
for(int fd =1;fd < szfdTable; fd++)
close(fd);
/* 但标准输入、标准输出和标准错误输出的重定向是可选的。
也许有的程序想保留标准输入0、标准输出1和标准错误输出2,
那么循环应绕过这三者。fd 从 3 开始计数
有的程序有些特殊的需求,还需要将这三者重新定向。如下:
int error=open("/tmp/error",O_WRONLY|O_CREAT,0600);
dup2(error,2);
close(error);
int in=open("/tmp/in",O_RDONLY|O_CREAT,0600);
if(dup2(in,0)==-1) perror("in");
close(in);
int out=open("/tmp/out",O_WRONLY|O_CREAT,0600);
if(dup2(out,1)==-1) perror("out");
close(out);
*/
// [6]
//chdir(""/tmp""); //改变工作目录到/tmp
/* 改变工作目录到根目录或特定目录
进程活动时,其工作目录所在的文件系统不能卸下。
一般需要将工作目录改变到根目录或特定目录,注意用户对此目录
需要有读写权。防止超级用户卸载设备时系统报告设备忙。
*/
// [7]
umask(0); // 重设文件创建掩模
signal(SIGCHLD,SIG_IGN); // 忽略SIGCHLD信号
return;
}
void initWinGuard()
{
}
extern string getFileName(string str);
int main(int argc, char* argv[])
{
// 保证一个实例在运行
/* tagProcInfo *pProc = new tagProcInfo;
pProc->strNam = getFileName(str);
pProc->strPath = getFilePath(str);
CProcGuard tPG;
bool bRun = tPG.IsProcRuning(pProc);
delete pProc;
if( bRun == true )
{
cout<<"this process`another object is runing"<<endl;
exit(0);
}
*/
#ifdef _WIN32
initWinGuard();
#else
initLinuxGuard();
#endif
printf("main...init...\n");
CProcGuard procguard;
printf("main...begin run\n");
procguard.Run();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -