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

📄 start.ec

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 EC
📖 第 1 页 / 共 2 页
字号:
/*=============================================================
 *	运行管理(启动系统, 关闭系统)	
 *
 * 最后修改	周国祥 2001/08/26 
===============================================================*/
#ifdef	XENIX
#include <tinfo.h>
#else
#include <curses.h>
#endif

#include <stdio.h>
#include <signal.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include "new_monitor.h"
#include "all.h"

#define MY_ROWS		4	
#define MY_LINES	2
#define MY_PAGE		15

EXEC SQL INCLUDE sqlca;
EXEC SQL WHENEVER SQLERROR CALL error_handler;
EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;

$include "db_struct.h";
$S_sys_module	p;
	
int	line;
int	fail;

startsys()
{
	WINDOW *my_win, *subwin;
	char filename[256];
	SHM1	*shm386;

	fail = 0;

	sprintf(filename, "/tmp/.startsys.%d", getpid());
	scr_dump(filename);

	disp_below("启动系统");
	prompt_bottom(LINES-1, 0, 1, " ");
	/*
	 * 生成新的屏幕用于工作区显示,
	 * 头上空三行:菜单名提示;划线;主菜单
	 * 尾空三行:可能的增加、查询菜单项;划线;输入提示
	 */
	my_win = newwin(LINES-3-3, COLS, 3, 0);
	mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
	wrefresh(my_win);
 
	h_winprompt(my_win, MY_LINES, MY_ROWS, "正在启动系统, 请稍候 ...", 0, 0);
	
	if (!no_init()) {
		clear_wline(my_win, MY_LINES+MY_PAGE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "系统已启动!", 1, 0);
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return(-1);
	}

#ifdef zgx010521_del
	/* 检查是否尚有进程为活动状态,不可再次启动系统 */
	if (check_program_pid(my_win) < 0) {
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return(-1);
	}
#endif

#ifdef zgx010520_added
#else
	/*
	 * 由于有时系统原因造成共享区数据与实际不一致,
	 * 即可能运行着的各模块的实际进程号未在系统状态
	 * 终准确登记,为避免重复运行各模块,造成系统
	 * 故障,此处加上此段处理,从系统进程表查找模块
	 * 名,关闭可能运行着的模块。
	 */
	kill_all_module(my_win);
#endif
#ifdef zgx010413
	system("initnas");
#else
	if ((shm386 = (SHM1 *)cshm1()) == NULL) {
		clear_wline(my_win, MY_LINES+MY_PAGE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "启动失败, 创建共享内存错!", 1, 0);
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return(-1);
	}
	memset(shm386, '\0', sizeof(SHM1));
	dt_shm(shm386);

	if (cmsg_nonb(RESP_MSG) < 0) {
		clear_wline(my_win, MY_LINES+MY_PAGE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "启动失败, 创建 RESP_MSG 错!", 1, 0);
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return(-1);
	}	
	if (cmsg_nonb(REQ_MSG) < 0) {
		clear_wline(my_win, MY_LINES+MY_PAGE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "启动失败, 创建 REQ_MSG 错!", 1, 0);
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return(-1);
	}	
#ifdef zgx010717_added
#else
	if (cmsg_nonb(TO_SAFE) < 0) {
		clear_wline(my_win, MY_LINES+MY_PAGE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "启动失败, 创建 TO_SAFE 错!", 1, 0);
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return(-1);
	}	
	if (cmsg_nonb(FROM_SAFE) < 0) {
		clear_wline(my_win, MY_LINES+MY_PAGE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "启动失败, 创建 FROM_SAFE 错!", 1, 0);
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return(-1);
	}	
#endif
	if (cmsg(MONITOR) < 0) {
		clear_wline(my_win, MY_LINES+MY_PAGE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "启动失败, 创建 MONITOR 错!", 1, 0);
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return(-1);
	}	
	
#endif

#ifdef zgx010621_added
#else
	/*
	 * 初始共享内存中的联行状态, 创建状态监控用信号灯
	 * in mytools/bank_stat.c & bank_stat_moni.c
	 */
	init_bank_stat_in_shm();
	init_bank_stat_moni();

#endif
	subwin = newwin(13, 80, 7, 0);
	scrollok(subwin, TRUE);

	start_program_mode(my_win, subwin);

	if (!fail) {
		S_sys_param sy;
		char buf[128],tail[128];
		PUBLIC pub;

		select_sys_param(&sy);
		sprintf(buf, "select count(*) from bank_base where \
			bank_id = '%s' and host_id = '%s' and moni_enable = 'Y'",
			sy.adm_bank_id, sy.adm_host_id);
		if (query_count(buf)) {
			sprintf(buf, "select count(*) from bank_base where \
				bank_id = '%s' and host_id = '%s'and login_stat = 'I'",
				sy.adm_bank_id, sy.adm_host_id);
			/* 除总行外无论原是否签到状态都需签到 */
			if (!query_count(buf) &&
				(strcmp(sy.bank_id, sy.adm_bank_id) ||
				strcmp(sy.host_id, sy.adm_host_id)) ) {
				if (!netlog_proc(0, &pub)) {
					log_net(pub.Rcv_bank_id,pub.Rcv_host_id,"签到");
					sprintf(tail, "%-30s", "成功!");
				} else
					sprintf(tail, "%-30s", "失败!");
				strcpy(pub.Acq_bank_id, pub.Rcv_bank_id);
				strcpy(pub.Acq_host_id, pub.Rcv_host_id);
				new_repos(MSG_TRANS, &pub, sizeof(PUBLIC));
				sprintf(buf, "进行 %-40s %s", "主机签到", tail);
				h_winprompt(subwin, line, MY_ROWS, buf, 0, 0);
				if (line < 12) line++;
			}
		}
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "启动系统成功!", 1, 0);
		delwin(subwin);
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return(0);
	} else {
		clear_wline(my_win, MY_LINES+MY_PAGE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "启动失败, 请查明原因! 必须手工签到后,才能进行交易!!!", 1, 0);
		delwin(subwin);
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return(-1);
	}
}

/** 启动NAS的进程 **/

int start_program_mode(WINDOW *my_win, WINDOW *subwin)
{
	char buf[80], tail[60];
	int pid, cnt;
	PSTAT pp;

	line = 0;

	$declare cur_4 cursor for
	select * from sys_module
	where start_mode not in ('0','1')
	order by module_id;
	if (SQLCODE) {
		errcall(ERROR, "Declare cursor error!(cur_4:%d)", SQLCODE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "Declare cursor error!", 1, 0);
		fail++;
		return(-1);
	}

	$open cur_4;
	if (SQLCODE) {
		errcall(ERROR, "Open cursor error!(cur_4:%d)", SQLCODE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "Open cursor error!", 1, 0);
		fail++;
		return(-1);
	}

	while (1) {
		$fetch cur_4 into :p;
		if (SQLCODE == 100) break;
		if (SQLCODE < 0) {
			errcall(ERROR, "Fetch cursor error!(cur_4:%d)", SQLCODE);
			$close cur_4;
			h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "Fetch cursor error!", 1, 0);
			fail++;
			dt_shm1();
			return(-1);
		}

#ifdef zgx010417_add
#else
		del_st_space("sys_module", &p);
#endif
	errcall(ERROR, "start: %s", p.prog_name);
		if (get_pid(p.prog_name, &pid) < 0) {
			sprintf(buf,"%s %s &", p.prog_name, p.prog_param);
			if (fork() == 0) {
				sqldetach();
#ifdef zgx010413
				system(buf);
#else
	
				execute_cmd(buf);
#endif
				exit(0);
			}
			wait(0);
		}
		
		nap(200);

		if (p.start_mode[0] == '3') {
			sprintf(buf, "启动 %-40s 成功!%25s", p.prog_desc, " ");
			h_winprompt(subwin, line, MY_ROWS, buf, 0, 0);
			if (line < 12) line++;
			continue;
		}

		cnt = 0;
		while (cnt < 5) {
			if (get_pid(p.prog_name, &pid) == 0)
				break;
			sleep(2);
			cnt++;
		}

		if (cnt < 5) {
			memset(&pp, 0, sizeof(PSTAT));
			sprintf(pp.name, "%s", p.prog_name);
			cnt = 0;
			while (cnt < 5) {
				if (sel_shm_pid(&pp) < 0 ||
				    pp.pause != ACTIVE && pp.pause != SETTIME) {
					sleep(2); 
					cnt++;
				} else break;
			}
			if (cnt < 5)
				sprintf(tail, "%24s", " ");
			else {
				sprintf(tail, "%-24s", "但状态异常!");
				fail++;
			}

			sprintf(buf, "启动 %-40s 成功! %s", p.prog_desc,
				tail);
			h_winprompt(subwin, line, MY_ROWS, buf, 0, 0);
			if (line < 12) line++;
		} else {
			errcall(ERROR, "ERR: %s[%d]", p.prog_name, pid);
			sprintf(buf, "启动 %-40s 失败!%25s", p.prog_desc,
				" ");
			fail++;
			h_winprompt(subwin, line, MY_ROWS, buf, 0, 0);
			if (line < 12) line++;
		}
	}

	$close cur_4;

	dt_shm1();
	return(0);
}

/*---------------------------------
return:	0 --- SUCC
	-1 --- FAIL
-----------------------------------*/
int check_program_pid(WINDOW *my_win)
{
	char	buf[90];
	int	pid;
	PSTAT	pp;

	EXEC SQL DECLARE cur_5 CURSOR FOR
	SELECT * FROM sys_module	
/****
	WHERE start_mode != '0'
****/
	WHERE start_mode not in ('0', '1')
	ORDER BY module_id ;
	if (SQLCODE) { 
		errcall(ERROR, "Declare cursor error!(check_prg_id:%d)", SQLCODE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "Declare cursor error!",
			    1, 0);
		return(-1);
	}

	EXEC SQL OPEN cur_5;
	if (SQLCODE) { 
		errcall(ERROR, "Open cursor error!(check_prg_id:%d)", SQLCODE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "Open cursor error!",
			    1, 0);
		return(-1);
	}

	while (1) {
		EXEC SQL FETCH cur_5 INTO :p;
		if (SQLCODE == 100) break;
		if (SQLCODE) {
			errcall(ERROR, "Fetch cursor error!(check_prg_id:%d)", SQLCODE);
			EXEC SQL CLOSE cur_5;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -