快速保存pid号到文件
#define MS_GUI_PID "/tmp/gui"
int ms_system(const char* cmd)
{
if (!cmd)
return -1;
int res = 0;
int status = 0;
pid_t pid = vfork();
struct rusage info;
memset(&info, 0, sizeof(struct rusage));
if (pid == 0)
{
//printf("child run.\n");
execl("/bin/sh", "/bin/sh", "-c", cmd, (char*) NULL);
//printf("child finished.\n");
_exit(1);
}
else if (pid > 0)
{
for(;;)
{
res = wait4(pid, &status, 0, &info);//wait4 base waitpid,wait4 more advanced
if (res > -1)
{
res = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
break;
} else if (errno != EINTR)
break;
}
//printf("parent finished.\n");
}
else
{
res = -1;
}
return res;
}
static void ms_save_gui_pid()
{
char cmd[32];
pid_t pId = getpid();
snprintf(cmd, sizeof(cmd), "echo %d > %s", pId, MS_GUI_PID);
ms_system(cmd);
}
//查询进程是否还在
int ms_is_dir_existed(const char* dir)
{
struct stat buf = {0};
if (!dir)
return 0;
if (lstat(dir, &buf) < 0)
return 0;
if (!S_ISDIR(buf.st_mode))
return 0;
return 1;
}
int mu_proc_exist(char *proc_path)
{
pid_t pId;
char sBuf[32] = {0};
FILE *fp = fopen(proc_path, "rb");
if(!fp)
return 0;
fgets(sBuf, sizeof(sBuf), fp);
fclose(fp);
if(sBuf[0] == '\0')
return 0;
pId = atoi(sBuf);
snprintf(sBuf, sizeof(sBuf), "/proc/%d", pId);
return ms_is_dir_existed(sBuf);
}