?? main.cpp
字號:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <process.h>
#include <windows.h>
#else
#include <unistd.h>
#include <signal.h>
#include <sys/stat.h>
#endif
#include "ProcGuard.h"
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
CProcGuard procguard;
procguard.Run();
return 0;
}
?? 快捷鍵說明
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -