📄 start.ec
字号:
/*=============================================================
* 运行管理(启动系统, 关闭系统)
*
* 最后修改 周国祥 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 + -