欢迎来到虫虫下载站 | 资源下载 资源专辑 关于我们
虫虫下载站

waitdisp.c

想学linux中的motif编程
C
第 1 页 / 共 2 页
字号:
    }    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;                                       /* タスク动扩姜位             */                ret = kill(pid, SIGKILL);                SUB_wsprint(waitout, "タスク动扩姜位 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);                                       /* デ〖タ构糠略ちに肋年されて */                                       /* いる眷圭                   */        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);                                       /* 矢机误面の焊宝の鄂球猴近   */                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) {                 /* 矢机误の焊娄の鄂球猴近     */            for(p = buffer;*p == ' ';p++);            strcpy(str, p);            strcpy(buffer, str);        }        if (flg & 2) {                 /* 矢机误の宝娄の鄂球猴近     */            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);                           /* 姜位                       */}

⌨️ 快捷键说明

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