【Linux】快速保存pid号到文件&查询进程是否存在

28 篇文章 0 订阅

快速保存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);
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值