由于getppid的不可靠因素, 如果想在程序中判断进程启动后是否被初始化为daemon, 可以使用readlink, popen和fread配合. 方法如下:
1. readlink获取程序名, getpid获取进程ID
char name[256] = {0};
pid_t pid = getpid();
readlink("/proc/self/exe", name, sizeof(name));
char *pCmd = strrchr(name, '/');
由于 readlink返回的是完整的程序路径, 需要用strrchr取到最后一个'/'字符.
2. popen执行ps, grep和awk构成的管道命令, 结果保存到FILE *中.
char cmd[256] = {0};
snprintf(cmd, sizeof(cmd), "ps -ef | grep %d | grep %s | grep -v grep | awk '{print $3}'", pid, pCmd);
FILE * fpReadStream;
fpReadStream = popen(cmd, "r");
3. fread读取命令执行结果
char buf[64] = {0};
if (fpReadStream != NULL)
{
size_t nread;
nread = fread(buf, sizeof(char), sizeof(buf), fpReadStream);
if (nread > 0)
{
int ppid = atoi(buf);
if (ppid == 1)
{
// 确定是daemon
}
}
// 注意完成后要关闭流
pclose(fpReadStream);
}