⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp.bak

📁 能查看系统进程
💻 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 + -