?? waitdisp.c
字號:
} buff[n] = 0;#if DEBUG printf("おまち攫鼠\n"); printf(" 妥滇メッセ〖ジ[%s]\n",buff);#endif /* 茶燙彈瓢妥滇 */ if (inf_default.fork_tasknam[0] != 0) { *pid = SUB_fork2(inf_default.fork_tasknam[0], buff, NULL); } else { *pid = SUB_fork2("omati", buff, NULL); } if (*pid > 0) { /* 彈瓢喇根の眷圭 */ sts = NORMAL; }#if DEBUG SUB_wsprint(waitout, "彈瓢タスクpid = %d\n", *pid);#endif return(sts);}static int wait_disp_off(pid)pid_t pid;{ int sts = ABNORMAL, ret = ABNORMAL; int idx;/*-------------------------------------------------------------------*/ if (pid > 0) { SUB_wsprint(waitout, "タスク姜位妥滇 pid=%d\n", pid); /* 彈瓢覺斗デ〖タ浮瑚 */ for(idx = 0;idx < wait_num;idx++) { /* 彈瓢覺斗デ〖タに判峽されて */ /* いるpidの眷圭 */ if (waitdisp[idx].pid == pid) { replace.flg = False; replace.pid = pid; /* タスク動擴(kuò)姜位 */ ret = kill(pid, SIGKILL); SUB_wsprint(waitout, "タスク動擴(kuò)姜位 pid=%d\n", pid); if (ret == 0) { SUB_wsprint(waitout, "タスク姜位借妄悸乖面...\n"); /* タスク姜位借妄が窗位するま */ /* でル〖プする */ while(replace.flg == False) ; sts = NORMAL; } else { SUB_wsprint(waitout, "茶燙久殿妥滇エラ〖 pid=%d ret=%d\n", pid, ret); } break; } } /* 彈瓢覺斗デ〖タに判峽されて */ /* いないpidの眷圭 */ if (ret != NORMAL && idx >= wait_num) { SUB_wsprint(waitout, "*** pid佰撅 pid=%d ***\n", pid); } } return(sts);}int getdata(ppid, data)int ppid;struct _waitdisp *data;{ int sts = ABNORMAL; char fname[MAXPATHLEN]; FILE *fp_r;/*-------------------------------------------------------------------*/ /* pidからファイル嘆を侯喇 */ sprintf(fname, "/tmp/waitdisp.%d", ppid); if (access(fname, F_OK) == 0) { /* ファイルが賂哼する眷圭 */ /* 山績するデ〖タ粕み哈み */ if ((fp_r = fopen(fname, "r")) != NULL) { if (fread(data, sizeof(struct _waitdisp), 1, fp_r) == 1) { sts = NORMAL; } fclose(fp_r); } else {/* sprintf(work, "getdata:%s", fname); perror(work);*/ sprintf(work, "getdata:%s error. %s\n", fname, sys_errlist); SUB_wsprint(waitout, work); } } else {/* sprintf(work, "getdata:%s", fname); perror(work);*/ sprintf(work, "getdata:%s:%s\n", fname, sys_errlist); SUB_wsprint(waitout, work); } return(sts);}void chld_end(){ int sts, statusp; int idx; pid_t pid;/*-------------------------------------------------------------------*/ pid = wait(&statusp); /* 姜位したタスクのpid艱評 */ signal(SIGCHLD, chld_end); /* シグナル減慨簇眶浩判峽 */ if (pid > 0) { /* 姜位したタスクがある眷圭 */#if DEBUG SUB_wsprint(waitout, "タスク姜位 pid=%d 姜位ステ〖タス %d\n", pid, statusp);#endif /* 姜位したタスクの彈瓢覺斗デ */ /* 〖タ浮瑚 */ for(idx = 0;idx < wait_num;idx++) { /* 姜位したタスクのpidが辦 */ /* 米する眷圭 */ if (waitdisp[idx].pid == pid) { waitdisp[idx].pid = 0; break; } } /* 姜位したタスクのデ〖タを猴 */ /* 近し、それ笆慣のデ〖タを1 */ /* つづつずらす */ for(;idx < wait_num - 1;idx++) { memcpy(&waitdisp[idx], &waitdisp[idx+1], sizeof(struct _waitdisp)); } wait_num --; if (wait_num < 0){ wait_num = 0; } waitdisp = (struct _waitdisp*)XtRealloc(waitdisp, sizeof(struct _waitdisp) * wait_num); /* デ〖タ構(gòu)糠略ちに肋年されて */ /* いる眷圭 */ if (replace.pid > 0 && pid == replace.pid) { replace.flg = True; replace.pid = 0; } } else { /* 姜位したタスクがない眷圭 */ SUB_wsprint(waitout, "姜位タスクなし\n"); }}int read_defaultdata(){ int idx; char path[MAXPATHLEN]; char buff[BUFSIZ]; char var[BUFSIZ], val[BUFSIZ]; char *p; FILE *fp_r; strcpy(path, "./.waitdisp"); /* カレントディレクトリにデフ */ /* ォルトデ〖タファイルがない */ if (access(path, F_OK) != 0) { /* 眷圭 */ path[0] = 0; if ((char*)getenv("SYSDIR") != NULL) { strcpy(path, (char*)getenv("SYSDIR")); strcat(path, "/f_waitdisp"); /* 茨董恃眶(SYSDIR)のディレク */ /* トリにデフォルトデ〖タファ */ /* イルがない眷圭 */ if (access(path, F_OK) != 0) { path[0] = 0; } } }#if DEBUG printf("デフォルトファイル嘆:%s\n", path);#endif /* デフォルトデ〖タ粕み哈み */ if ((fp_r = fopen(path, "r")) != NULL) { while(fgets(buff, sizeof(buff), fp_r) != NULL) { /* 猖乖猴近 */ if ((p = (char*)strchr(buff, '\n')) != NULL) { *p = '\0'; } /* コメント猴近 */ if ((p = (char*)strchr(buff, '#')) != NULL) { *p = '\0'; } if (strlen(buff) <= 0) { continue; }#if DEBUG printf("buff:%s\n", buff);#endif memset(var, 0x00, sizeof(var)); memset(val, 0x00, sizeof(val)); if ((p = (char*)strchr(buff, ':')) != NULL) { *p = '\0'; strcpy(var, buff); strcpy(val, p+1); /* 矢機(jī)誤面の焊寶の鄂球猴近 */ spccut(var, (1 | 2)); spccut(val, (1 | 2)); }#if DEBUG printf("var[%s]\n", var); printf("val[%s]\n", val);#endif for(idx = 0;default_tbl[idx].type >= 0;idx++) { if (default_tbl[idx].name != NULL) { if (strcmp(default_tbl[idx].name, var) == 0) { default_tbl[idx].data = (char*)XtMalloc(strlen(val) + 1); strcpy(default_tbl[idx].data, val);#if DEBUG printf("type=%d:%s:%s\n", default_tbl[idx].type, default_tbl[idx].name, default_tbl[idx].data);#endif } } } } }}//KECint get_defaultdata( char *keyword, char *chardat, int *intdat, float *floatdat, ... ){ va_list argp; int idx; va_start( argp ,floatdat); if (keyword != NULL) { for(idx = 0;default_tbl[idx].type >= 0;idx++) { if (strcmp(keyword, default_tbl[idx].name) == 0) { if (default_tbl[idx].type == 0) { chardat = (char*)va_arg(argp, char*); if (default_tbl[idx].data != NULL) { strcpy(chardat, default_tbl[idx].data); } else { chardat[0] = 0; } } else if (default_tbl[idx].type == 1) { intdat = (int*)va_arg(argp, int*); if (default_tbl[idx].data != NULL) { *intdat = atoi(default_tbl[idx].data); } else { *intdat = 0; } } else if (default_tbl[idx].type == 2) { floatdat = (float*)va_arg(argp, float*); if (default_tbl[idx].data != NULL) { *floatdat = atof(default_tbl[idx].data); } else { *floatdat = 0.0; } } break; } } } va_end(argp);}//KEC#if 0int get_defaultdata(va_alist)va_dcl{ va_list argp; int idx; int *intdat; float *floatdat; char *chardat; char *keyword; va_start(argp); keyword = (char*)va_arg(argp, char*); if (keyword != NULL) { for(idx = 0;default_tbl[idx].type >= 0;idx++) { if (strcmp(keyword, default_tbl[idx].name) == 0) { if (default_tbl[idx].type == 0) { chardat = (char*)va_arg(argp, char*); if (default_tbl[idx].data != NULL) { strcpy(chardat, default_tbl[idx].data); } else { chardat[0] = 0; } } else if (default_tbl[idx].type == 1) { intdat = (int*)va_arg(argp, int*); if (default_tbl[idx].data != NULL) { *intdat = atoi(default_tbl[idx].data); } else { *intdat = 0; } } else if (default_tbl[idx].type == 2) { floatdat = (float*)va_arg(argp, float*); if (default_tbl[idx].data != NULL) { *floatdat = atof(default_tbl[idx].data); } else { *floatdat = 0.0; } } break; } } } va_end(argp);}#endifint spccut(str, flg)char *str;int flg;{ int idx; int len; char *buffer, *p; if (str != NULL) { buffer = (char*)XtMalloc(strlen(str) + 1); memset(buffer, 0x00, strlen(str) + 1); strcpy(buffer, str); if (flg & 1) { /* 矢機(jī)誤の焊婁の鄂球猴近 */ for(p = buffer;*p == ' ';p++); strcpy(str, p); strcpy(buffer, str); } if (flg & 2) { /* 矢機(jī)誤の寶婁の鄂球猴近 */ len = strlen(buffer); for(p = buffer + strlen(buffer) - 1;*p == ' ';p--) { len --; if (len < 1) { break; } } *(p+1) = '\0'; strcpy(str, buffer); } XtFree(buffer); buffer = NULL; }}void quit(){ int idx; Atom window_id;/*-------------------------------------------------------------------*/ printf("waitdisp 姜位\n"); /* イベント流減慨借妄豺近 */ XtRemoveEventHandler(label, NoEventMask, True, recv_proc, NULL); XtRemoveTimeOut(interval_id); /* タイマ借妄豺近 */ for(idx = wait_num - 1;idx >= 0;idx--) { if (waitdisp[idx].pid > 0) { /* 山績面の茶燙がある眷圭 */ wait_disp_off(waitdisp[idx].pid); } } window_id = XInternAtom(dpy, "__WAITDISP", False); XDeleteProperty(dpy, RootWindow(dpy, 0), window_id); if (waitdisp != NULL) { XtFree(waitdisp); waitdisp = NULL; } if (evt_tbl != NULL) { XtFree(evt_tbl); evt_tbl = NULL; } exit(0); /* 姜位 */}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -