免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1361 | 回复: 3
打印 上一主题 下一主题

为什么在solaris系统下就不能运行! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-07-05 15:36 |只看该作者 |倒序浏览
以下是一个在hp-ux和scounix下都能正常编译运行的程序,移到solaris下编译没问题(gcc menu.c -o menu -lcurses),一运行就报错(Segmentation Fault - core dumped)。请高手一定要帮忙看看,谢谢谢谢,万分感谢!


/*****************************************************************
本程序需要借肋两个参数文件来实现 :
(1)、对菜单中每一项参数进行说明的文件(menu.def),它格式如下所述:
!所属菜单代号!项顺序号!菜单项名称!外挂程序名称!下级菜单代号!
说明:
1、如菜单代号为"0",则表示此项属于主菜单;
2、如外挂程序名称为"0",则表示此菜单项对应的过程在菜单程序内部或对应于一个子菜单;
3、如下级菜单代号为"0",则表示此菜单项无下级子菜单;
4、项顺序号同时可作为菜单热键使用。
假如文件menu.def中有下面这一行:
!0!3!格式化磁盘!format /dev/rfd0135ds18!0!
它表示主菜单的第三项为格式化磁盘,它对应的执行过程为 format /dev/rfd0135ds18,本项无子菜单。
如果用户想把自己编的实现查询功能程序XXX挂到本程序主菜单第4项上,则可在menu.def中增加下面
这一行:
!0!4!查询!XXX!0!
(2)、对各菜单参数进行说明文件(menu.conf),其格式如下所述:
!菜单代号!上一级菜单代号!边框标志!菜单宽度!菜单行数!菜单列数!起始横坐标!起始纵坐标!
说明:
1、边框标志为"0"表示无框,为"1"表示有边框;
2、上级菜单代号为"-1",表示无上级菜单;
3、如菜单代号为"0",表示主菜单。
当用户对菜单显示样式不满意时,可通过调整此文件设计个性化的界面
系统是scounix的。
编译 cc menu.c -o menu -lcurses
****************************************************************/
#include <curses.h>;
#include <stdlib.h>;
#define ESC 27  
#define ENT 13  
#define REFRESH 12  
#define MAX_M 4 /* 菜单最大层数 */  

void initial(),nomlastpos(),revcurpos(),disponepage(),dispprevline();
void dispnextline(),domenu(),getmenuconf(),keycont();
void getitem(), get_m_conf(), get_m_item(),clearwin(),execprog();
/* 标识每一菜单项的结构 */
struct menu {
   short menu_code; /* 所属菜单代号 */

   short item_order; /* 项顺序号 */

   char item[10]; /* 菜单项名称 */

   char prog[40]; /* 本项菜单执行程序 */

   short submenu_code; /* 下一级菜单编号 */

   struct menu *next; /* 指向上一项的指针 */

   struct menu *prev; /* 指向下一项的指针 */

} m_item,*head,*this,*new,*last,*scrpos,*lastscrpos,*begin,*lastbegin,*lastscr[MAX_M];
/* 标识每一菜单内容的结构 */
struct menuconf {
   short menu_code; /* 菜单代号 */

   short last_code; /* 上一级菜单代号 */

   short bord_flag; /* 边框标志 0--无边框 1--有边框 **/

   short m_wight; /* 菜单显示宽度 */

   short m_lengh; /* 每一行项数 */

   short m_col; /* 菜单列数 */

   short m_bx; /* 菜单起始横坐标 */

   short m_by; /* 菜单起始纵坐标 */

} m_conf;
WINDOW *menuwin, *boxwin, *curw, *lastw[MAX_M], *workwin;
long curpos, lastcurpos, lastscrcurpos, lastmenucur[MAX_M];
short menu_no = 0, wno = 0;

main()
{
   initial();
   getmenuconf(0); /* 取第0号菜单参数 */


   /* 创建主窗口 */
   menuwin=newwin(m_conf.m_lengh, m_conf.m_wight, m_conf.m_bx+1, m_conf.m_by+1);
   curw=menuwin;
   lastw[wno]=menuwin;

   getitem(); /* 取当前菜单各项内容 */

   domenu(head, 0);
   endwin();
}
/* 取菜单各项参数函数 */
void getitem()
{
   FILE *fp;
   char buff[0x100];

   /* 建边框窗口 */
   boxwin=newwin(m_conf.m_lengh+2,m_conf.m_wight+2,m_conf.m_bx,m_conf.m_by);
   keypad(curw, TRUE);
   if (m_conf.bord_flag==1) {
      box(boxwin, 0,0 );
      wrefresh(boxwin);
   }

   head=NULL;
   if ((fp = fopen("menu.def","r") == NULL) {
      printw( "\n不能打开菜单定义文件\n";
      refresh();
      endwin();
      exit(-1);
   }
   while( fgets(buff, 0x100, fp)!=NULL) {
      get_m_item(buff);

      if (m_item.menu_code != menu_no)
         continue;

      new=(struct menu*)malloc(sizeof(struct menu));
      if (head == NULL) {
         last = head;
         head = new;
      }
      else {
         this->;next = new;
         last = this;
      }
      this = new;
      this->;menu_code=m_item.menu_code;
      this->;item_order=m_item.item_order;
      strcpy(this->;item,m_item.item);
      strcpy(this->;prog,m_item.prog);
      this->;submenu_code=m_item.submenu_code;
      this->;next=NULL;
      this->;prev = last;
   }
   fclose(fp);
}
/* 菜单处理函数 */
void domenu(curscrp, curp)
struct menu *curscrp;
int curp;
{
   int i, x, y;
   struct menu *mpos;
   int  ch;

   this = head;
   disponepage(this);
   curpos = curp;
   scrpos = curscrp;
   lastcurpos = lastscrcurpos = 0;
   revcurpos();
   for(; {
   ch=wgetch(curw);
      switch (ch) {
      case ENT:
         /* 有下一级菜单 */
         if ((!strcmp(scrpos->;prog, "0") && (scrpos->;submenu_code != 0)) {
            lastbegin = begin->;next;
            getmenuconf(scrpos->;submenu_code);
            menu_no = scrpos->;submenu_code;

            wno++;
            lastmenucur[wno]=curpos;
            lastscr[wno] = scrpos;
            lastw[wno]=curw;

            workwin=newwin(m_conf.m_lengh,m_conf.m_wight,m_conf.m_bx+1,m_conf.m_by+1);
            curw=workwin;
            getitem();
            domenu(head, 0);
         }
         /* 是内部函数 */
         /* 是外部可执行程序 */
         else {
            endwin();
            execprog();
         }
         break;
      case ESC:
      case 'q':
      case 'Q':
      case '0':
         /* 无上级菜单 */
         if (m_conf.last_code == -1) {
            clearwin();
            endwin();
            exit(0);
         }
         /* 有上级菜单 */
         else {
            menu_no = m_conf.last_code;
            clearwin();
            getmenuconf(menu_no);
            getitem();
            touchwin(lastw[wno]);
            curw=lastw[wno];
            curpos = lastmenucur[wno];
            scrpos = lastscr[wno];
            wno--;
            wrefresh(curw);
         }
         break;
      case 'r':
      case 'R':
      case REFRESH: /* 重显屏幕 */

         wrefresh(curscr);
         break;
      case KEY_RIGHT: /* 右光标键 */

         if ( scrpos->;next != NULL ) {
            lastcurpos = curpos;
            lastscrpos = scrpos;
            scrpos=scrpos->;next;
            getyx(curw, x, y);
            if((x==m_conf.m_lengh-1)&&(curpos%m_conf.m_col==m_conf.m_col-1)){
               curpos-=(m_conf.m_col-1);
               lastcurpos = curpos - 1;
               /* 实现向上卷屏 */
               wmove(curw, 0, 0);
               wdeleteln(curw);
               dispnextline("R";
            }
            else
               curpos++;
            if ((curpos%m_conf.m_col == 0) && (m_conf.m_lengh == 1)) {
               revcurpos();
               break;
            }
            else {
               nomlastpos();
               revcurpos();
            }
         }
         break;
      case KEY_LEFT: /* 左光标键 */

         if ( scrpos->;prev != NULL ) {
            lastcurpos = curpos;
            lastscrpos = scrpos;
            scrpos=scrpos->;prev;
            getyx(curw, x, y);
            if ((x==0) && (curpos%m_conf.m_col ==0)) {
               curpos+=m_conf.m_col-1;
               lastcurpos = curpos + 1;
               /* 实现向下卷屏 */
               winsertln(curw);
               dispprevline("L";
            }
            else
               curpos--;
            if ((curpos%m_conf.m_col==m_conf.m_col-1)&&(m_conf.m_lengh==1)) {
               revcurpos();
               break;
            }
            else {
               nomlastpos();
               revcurpos();
            }
         }
         break;
      case KEY_UP: /* 上光标键 */

         lastcurpos = curpos;
         lastscrpos = scrpos;
         mpos = scrpos;
         for(i=0;i < m_conf.m_col;i++){
            if ( mpos->;prev != NULL ) mpos=mpos->;prev;
            else break;
         }
         if ( i==m_conf.m_col ) {
            getyx(curw, x, y);
            if (x==0) {
               lastcurpos += m_conf.m_col;
               /* 实现向下卷屏 */
               winsertln(curw);
               dispprevline("U";
            }
            else {
               curpos-=m_conf.m_col;
            }
            scrpos = mpos;
            if ( m_conf.m_lengh!=1)
               nomlastpos();
            revcurpos();
         }
         break;
      case KEY_DOWN: /* 下光标键 */

         lastcurpos = curpos;
         lastscrpos = scrpos;
         mpos = scrpos;
         for(i=0;i < m_conf.m_col;i++){
            if ( mpos->;next != NULL )
               mpos=mpos->;next;
            else
               break;
         }
         if ( i==m_conf.m_col ) {
            getyx(curw, x, y);
            if (x==m_conf.m_lengh-1) {
               lastcurpos -= m_conf.m_col;
               /* 实现向上卷屏 */
               wmove(curw, 0, 0);
               wdeleteln(curw);
               dispnextline("D";
            }
            else
               curpos+=m_conf.m_col;
            scrpos = mpos;
            if ( m_conf.m_lengh!=1)
               nomlastpos();
            revcurpos();
         }
         break;
      default:
         beep();
         break;
      }
   }
}
/* 反显当前项函数 */
void revcurpos()
{
   wattrset(curw, A_STANDOUT);
   wmove(curw, curpos/m_conf.m_col,  
       (curpos%m_conf.m_col)*m_conf.m_wight/m_conf.m_col+m_conf.m_col);
   wprintw(curw, "%s", scrpos->;item);
   wattrset(curw, A_NORMAL);
   wrefresh(boxwin);
}
/* 正常显示上一项函数 */
void nomlastpos() {
   wmove(curw, lastcurpos/m_conf.m_col, (lastcurpos%m_conf.m_col)
       *m_conf.m_wight/m_conf.m_col+m_conf.m_col);
   wprintw(curw, "%s", lastscrpos->;item);
}
/* 显示一页函数 */
void disponepage(first)
struct menu *first;
{
   short col, row;

   begin=first; /* begin 为本页首指针 */
   for(row=0; row<m_conf.m_lengh;row++){
      for(col=0; col<m_conf.m_col;col++){
         /* m_conf.m_wight/m_col为每一菜单项应占字符数*/
         wmove(curw,row,col*m_conf.m_wight/m_conf.m_col+m_conf.m_col);
         wprintw(curw, "%s", first->;item);
         wrefresh(curw);
         last = first;
         first = first->;next;
         if (first == NULL) {
            break;
         }
      }
   }
}
/* 显示上一行函数 */
void dispprevline(flag)
char flag[2]; /* L-左光标引起 U-上光标引起 */
{
   struct menu *tmppos;
   int tmpcurpos;

   tmpcurpos = curpos;
   tmppos = scrpos;
   if ( flag[0] == 'U') {
      while ( tmpcurpos % m_conf.m_col != 0) {
         tmppos = tmppos->;prev;
         tmpcurpos--;
      }
      tmppos = tmppos->;prev;
   }
   for (tmpcurpos = m_conf.m_col-1; tmpcurpos >;= 0; tmpcurpos--) {
      wmove(curw, 0, (tmpcurpos%m_conf.m_col)*m_conf.m_wight/m_conf.m_col+m_conf.m_col);
      wprintw(curw, "%s", tmppos->;item);
      begin = tmppos; /*begin 为本页首指针*/
      last = tmppos;
      tmppos = tmppos->;prev;
      if (tmppos == NULL)
         break;
   }
   wrefresh(curw);
}
/* 显示下一行函数 */
void dispnextline(flag)
char flag[2];/* R-右光标引起 D-下光标引起 */
{
   struct menu *tmppos;
   int tmpcurpos;

   tmpcurpos = curpos;
   tmppos = scrpos;
   if ( flag[0] == 'D') {
      while ( tmpcurpos % m_conf.m_col != m_conf.m_col-1) {
         tmppos = tmppos->;next;
         tmpcurpos++;
      }
      tmppos = tmppos->;next;
   }

   for (tmpcurpos = 0; tmpcurpos < m_conf.m_col; tmpcurpos++) {
      wmove(curw, m_conf.m_lengh-1, (tmpcurpos%m_conf.m_col)*m_conf.m_wight/m_conf.m_col+m_conf.m_col);
      wprintw(curw, "%s", tmppos->;item);
      last=tmppos;/* last 为本页最后一个结点指针 */
      begin=tmppos;
      tmppos = tmppos->;next;
      if (tmppos == NULL)
         break;
   }
}
/* 取指定菜单参数函数 */
void getmenuconf(menu_code)
short menu_code;
{
   FILE *fp;
   char menu_buff[0x100];

   if ((fp = fopen("menu.conf", "r")==NULL) {
      printw( "can not open menu config file";
      refresh();
      endwin();
      exit(-1);
   }
   while( fgets(menu_buff, 0x100, fp)!=NULL ) {
      get_m_conf(menu_buff);
      if (m_conf.menu_code == menu_code)
         break;
   }
   return ;
}
/* 取指定菜单参数处理函数 */
void get_m_conf(menu_conf)
char *menu_conf;
{
   register i, j, k;
   char buff[20];

   j = k = 0;
   for (i = 0; i < strlen(menu_conf); i++) {
      if ( menu_conf == '!' ) {
         j++;
         if ( j == 1) {
            k = i+1;
            continue;
         }
         switch(j) {
         case 2:
            memcpy(buff, &menu_conf[k], i-k);
            buff[i-k]=0;
            m_conf.menu_code = atoi(buff);
            k=i+1;
            break;
         case 3:
            memcpy(buff, &menu_conf[k], i-k);
            buff[i-k]=0;
            m_conf.last_code = atoi(buff);
            k=i+1;
            break;
         case 4:
            memcpy(buff, &menu_conf[k], i-k);
            buff[i-k]=0;
            m_conf.bord_flag = atoi(buff);
            k=i+1;
            break;
         case 5:
            memcpy(buff, &menu_conf[k], i-k);
            buff[i-k]=0;
            m_conf.m_wight = atoi(buff);
            k=i+1;
            break;
         case 6:
            memcpy(buff, &menu_conf[k], i-k);
            buff[i-k]=0;
            m_conf.m_lengh = atoi(buff);
            k=i+1;
            break;
         case 7:
            memcpy(buff, &menu_conf[k], i-k);
            buff[i-k]=0;
            m_conf.m_col = atoi(buff);
            k=i+1;
            break;
         case 8:
            memcpy(buff, &menu_conf[k], i-k);
            buff[i-k]=0;
            m_conf.m_bx = atoi(buff);
            k=i+1;
            break;
         case 9:
            memcpy(buff, &menu_conf[k], i-k);
            buff[i-k]=0;
            m_conf.m_by = atoi(buff);
            k=i+1;
            break;
         default:
            break;
         }
      }
   }
}
/* 取指定项参数处理函数 */
void get_m_item(menu_item)
char *menu_item;
{
   register i, j, k;
   char buff[80];

   j = k = 0;
   for (i = 0; i < strlen(menu_item); i++) {
      if ( menu_item == '!' ) {
         j++;
         if ( j == 1) {
            k = i+1;
            continue;
         }
         switch(j) {
         case 2:
            memcpy(buff, &menu_item[k], i-k);
            buff[i-k] = 0;
            m_item.menu_code = atoi(buff);
            k=i+1;
            break;
         case 3:
            memcpy(buff, &menu_item[k], i-k);
            buff[i-k] = 0;
            m_item.item_order = atoi(buff);
            k=i+1;
            break;
         case 4:
            memcpy(buff, &menu_item[k], i-k);
            buff[i-k] = 0;
            strcpy(m_item.item,buff);
            k=i+1;
            break;
         case 5:
            memcpy(buff, &menu_item[k], i-k);
            buff[i-k] = 0;
            strcpy(m_item.prog,buff);
            k=i+1;
            break;
         case 6:
            memcpy(buff, &menu_item[k], i-k);
            buff[i-k] = 0;
            m_item.submenu_code = atoi(buff);
            k=i+1;
            break;
         default:
            break;
         }
      }
   }
}
/* 初始化资源*/
void initial() /* 自定开启 curses 函式 */  
{
   initscr();        //开启curses模式
   //是一般 curses 程式必须先呼叫的函数, 一但这个函数被呼叫之後, 系统将根据终端机的形态并启动 curses 模式
   cbreak();
   nonl();
   noecho();
   intrflush(stdscr,FALSE);
   keypad(stdscr,TRUE);
   refresh();
}
/* 按键等待函数 */
void keycont()
{
   fprintf(stderr, "按键继续...");
   getchar();
}
/* 运行可执行程序函数 */
void execprog()
{
   def_prog_mode();   
        //system("clear");
   //fprintf(stderr, "%s: \n", scrpos->;item);
   system(scrpos->;prog);
   reset_prog_mode();
   keycont();
   initial();
   touchwin(boxwin);
   touchwin(curw);
   keypad(curw, TRUE);
   wrefresh(boxwin);
   wrefresh(curw);
}
/* 清除窗口函数 */
void clearwin()
{
   wmove(boxwin, 0, 0);
   wclrtobot(boxwin);
   wrefresh(boxwin);
   delwin(curw);
   delwin(boxwin);
}

论坛徽章:
0
2 [报告]
发表于 2004-07-05 15:47 |只看该作者

为什么在solaris系统下就不能运行!

Segmentation Fault - core dumped

80%的可能:程序有不规范的地方,这是个艰苦的工作,还是请你自己仔细检查
20%的可能:不确定因素,比如系统漏洞。。

论坛徽章:
0
3 [报告]
发表于 2004-07-05 16:58 |只看该作者

为什么在solaris系统下就不能运行!

救救我!

论坛徽章:
0
4 [报告]
发表于 2004-07-05 21:56 |只看该作者

为什么在solaris系统下就不能运行!

程序这么长,谁有工夫看。
搂主还是自己慢慢完 adb 吧!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP