在Unix/Linux中創建一個後台進程的步驟
1、調用fork函數,創建一個子進程。
2、先讓父進程自然結束。
3、在子進程中調用setpgrp(),把子進程的進程組ID設為子進程的進程ID。
4、在子進程中調用setsid(),創建一個新的Session(會話),這樣子進程就與當前的控制終端脫離,也接受不到當前終端的(ctrl + c)消息。
實現代碼如下(運行環境:虛擬機下的Ubuntu):
/*
* Author: ACb0y
* FileName: main.cpp
* Create Time: 2011-07-24
* Version: V1.0
*/
#include <iostream>
#include <unistd.h>
using namespace std;
void print()
{
int pid = getpid();
int gid = getpgid(0);
cout << "process group id = " << gid << endl;
cout << "process id = " << pid << endl;
}
int main()
{
//create a child process.
int pid = fork();
if (-1 == pid)
{
cout << "call function fork() error!" << endl;
}
else if (0 == pid) //return from child process.
{
cout << "----------in child process.----------" << endl;
print();
cout << "--------------------------------------" << endl;
//將該進程的進程組ID設置為該進程的進程ID。
setpgrp();
cout << "----------in child process. setpgrp()----------" << endl;
print();
cout << "--------------------------------------" << endl;
//創建一個新的Session,斷開與控制終端的關聯。也就是說Ctrl+c的觸發的SIGINT信號,該進程接收不到。
setsid();
for (int i = 0; i < 5; ++i)
{
sleep(20);
cout << "----------in child process.----------" << endl;
print();
cout << "--------------------------------------" << endl;
}
}
else //return from parent process.
{
cout << "----------in parent process.----------" << endl;
print();
cout << "--------------------------------------" << endl;
}
return 0;
}