shell脚步运行C文件操作权限问题

shell脚步运行C文件操作权限问题

我有一段C语言代码,此段代码码的核心内容是对文件进行读写操作记录数据(对数据文件进行fwrite  fread之类的操作)。而在运行此C文件需要设置一些环境变量。
    为了方便我写了一个小shell脚本,这个脚本前面是设置运行C文件所需要的环境变量,最后一句话则是运行此C文件。可用shell脚本调用运行的C文件无法对数据文件进行读写操作(甚至fopen数据文件都报错),而在终端设置好环境变量后直接运行C文件则没有问题。
    我估计是权限问题,可是不晓得怎么解决,请各位大虾帮帮忙。

shell 脚本大概内容如下:
#!/bin/sh
my_dir="$(pwd)"   //脚步路径


export FINGERPATH=/home/demo/fpconfig   //设置环境变量
chmod 777 /dev/ttyS0

exec /$my_dir/demo/demo  //调用C程序


C代码其实就是简单链表对文件的读写操作
       
代码:

#include   <stdio.h>
#include <unistd.h>

#include <stdlib.h>   


typedef struct Finger      
{
   int ID;                               //用户ID
   int RegLen;                           //字符串长度
   unsigned char  RegBuffer[512+1];      //字符串数据
   struct Finger *next;                  //下一个节点
}Fnode;


Fnode *InitLink(Fnode *head);    //从文件读取数据,初始化链表
Fnode *AddNode(Fnode *head,int ID,int RegLen,unsigned char  *RegBuffer);  //添加节点
Fnode *del(Fnode *head,int ID);  //删除节点
Fnode *Find(Fnode *head,int ID);  //查找节点
void ShowAll(Fnode *head);  //显示所有节点
void ClearAll(Fnode *head);  //清空所有链表
下面是函数实现代码,main函数就懒的帖出来了,就几行,调用这几个函数对链表进行操作。

       
代码:


//读取指纹数据到链表,指纹数据初始化
Fnode *InitLink(Fnode *head)
{
   Fnode *pr,*p;
   FILE * fp;
   int num,i;
   char ch=-1;            //默认空返回值  

   if((fp=fopen("../fpconfig/finger.dat","rb"))==NULL)
   {
      fprintf(stderr, "There are no finger data file!\n");
      return NULL;
   }

   ch=fgetc(fp);         //读取节点数目
   if(ch==EOF)            //判断数据文件是否为空
   {
      printf("\nNULL data!!!\n");
      return NULL;
   }
   num=ch;         //字符转整型减去对应数值
   
//   printf("节点数量num=%d  ch=%d\n",num,ch,ch);

   for(i=0;i<num;i++)               //读出文件数据存入对应链表
   {
      p=(Fnode *)malloc(sizeof(Fnode));;
      if(p==NULL)
      {
         fprintf(stderr, "Not enough memory to malloc!\n");
         return NULL;
      }      
      if( (fread(p,sizeof(Fnode),1,fp))==0 )         //得到链表数据
      {
         fprintf(stderr, "NULL finger data!\n");
         return NULL;         
      }
      else
      {
//         printf("i=%d 链表的ID:%d\t节点长度:%d\n",i,p->ID,p->RegLen);
         p->next=NULL;                     //先将后续节点制空
      }
      
      if(i==0)                              //链表头节点
      {
         head=p;
         pr=p;
      }
      else                                 //链表其他节点
      {
         pr=head;
         while(pr->next!=NULL)               //将pr指针移动到原指针末尾
         {
            pr=pr->next;
         }   
         pr->next=p;
      }
   }

   fclose(fp);
   return head;
}





//添加指纹节点
Fnode *AddNode(Fnode *head,int ID,int RegLen,unsigned char  *RegBuffer)
{
   Fnode *pr,*p;
   FILE * fp;
   char ch,rch;   
   ch=0;
   rch=0;

   if((fp=fopen("../fpconfig/finger.dat","rb+"))==NULL)   //打开数据文件
   {
      printf("\nCreat finger file!!!!!!!!!!!!!\n\n");       //如果没有就新建数据文件
      if((fp=fopen("../fpconfig/finger.dat","wb+"))==NULL)   //用shell文件调用就是这里报错,直接运行没问题
      {
         fprintf(stderr, "Can not open finger.dat to add!\n");
         return NULL;
      }
   }
   rewind(fp);

   p=(Fnode *)malloc(sizeof(Fnode));
   if(p==NULL)
   {
      fprintf(stderr, "Not enough memory to malloc!\n");
      return NULL;
   }
   p->ID=ID;
   p->RegLen=RegLen;
   memcpy(p->RegBuffer,RegBuffer,RegLen);
   

   
   if(head==NULL)    //空链表
   {
      p->next==NULL;
      head=p;
      pr=p;
      ch=1;
      rewind(fp);   
      fputc(ch,fp);  //写入节点数量为1
      rewind(fp);   
      rch=fgetc(fp);            //取得原来节点数   
   }
   else            //末尾插入数据
   {
      pr=head;
      while(pr->next!=NULL)   //将pr指针移动到原指针末尾
      {
         pr=pr->next;
      }
      pr->next=p;
      p->next=NULL;
      rewind(fp);   
      ch=fgetc(fp);            //取得原来节点数
      ch++;                   //增加一个节点
      rewind(fp);               //文件指针重回文件首部
      fputc(ch,fp);           //写回节点数量
   }
   fseek(fp,0,SEEK_END);                        //指针移动到文件末尾
   if( (fwrite(p,sizeof(Fnode),1,fp)) ==0 )     //将新节点数据写入文件
   {
      fprintf(stderr, "Faild to write data!\n");
      return NULL;   
   }
//   else
//      printf("添加节点成功:ID:%d RegLen:%d!!!\n",p->ID,p->RegLen);
      
   fclose(fp);
   return head;
}





//删除指定ID的指纹节点
Fnode *del(Fnode *head,int ID)
{
   Fnode *pr,*p;
   FILE * fp;
   char ch,rch;   
   int i,num;
   ch=0;
   rch=0;

   printf("\nBegain to delete finger ID=%d!!!!!!!!!!!!!!\n",ID);
   
   
   if(head==NULL)      //判断是否是空链表
   {
      fprintf(stderr, "Empty link table!\n");
      return head;
   }
   
   pr=head;
   p=head;
   
   while(p->ID!=ID && p->next!=NULL)    //找到对应ID的节点
   {
      pr=p;
      p=p->next;
   }
   if(p->ID==ID)
   {
      if(p==head)
      {
         head=p->next;          //如果删除头节点,则第二个节点变成头节点
      }
      else
      {
         pr->next=p->next;   //中间节点,则将上一节点指针指向本节点下一节点      
      }
      free(p);
      p=NULL;
   }
   else
      printf("\nCan't find the node!\n");   
   
   
   if((fp=fopen("../fpconfig/finger.dat","rb+"))==NULL)   //打开数据文件
   {
      fprintf(stderr, "Can not open finger.dat!\n");    //用shell文件调用就是这里报错,直接运行没问题
      return NULL;
   }   
   rewind(fp);   
   ch=fgetc(fp);            //取得原来节点数
   ch--;                   //节点数自减1      
   fclose(fp);
            
   
   if((fp=fopen("../fpconfig/finger.dat","wb"))==NULL)   //打开数据文件,写回删除后链表数据
   {
      fprintf(stderr, "Can not open finger.dat!\n");
      return NULL;
   }   
   fputc(ch,fp);            //写回节点数量

   if(head!=NULL)
   {   
      pr=head;
      p=head;
//      printf("幸存节点:ID=%d\tRegLen=%d\n",p->ID,p->RegLen);
      if( (fwrite(p,sizeof(Fnode),1,fp)) ==0 )     //将头节点数据写入文件
      {
         fprintf(stderr, "Faild to write data!\n");
         return NULL;   
      }         
      while(p->next!=NULL)    //找到对应ID的节点
      {      
         pr=p;
         p=p->next;
//         printf("幸存节点:ID=%d\tRegLen=%d\n",p->ID,p->RegLen);      
         if( (fwrite(p,sizeof(Fnode),1,fp)) ==0 )     //将节点数据写入文件
         {      
            fprintf(stderr, "Faild to write data!\n");
            return NULL;   
         }         
      }
   }
   else
   {
      Fnode zero;  
      memset(&zero,0, sizeof(zero));
      if( (fwrite(&zero,sizeof(zero),50,fp)) ==0 )     //将节点数据写入文件
      {
         fprintf(stderr, "Clear data erro!\n");
         return NULL;   
      }
      printf("NULL data!\n");            
         
   }      
   
   fclose(fp);   
   return head;
}


//查找指定ID的指纹节点
Fnode *Find(Fnode *head,int ID)
{
   Fnode *pr,*p;
   FILE * fp;
   int i,num;
   
   if(head==NULL)      //判断是否是空链表
   {
      fprintf(stderr, "Empty link table!\n");
      return NULL;
   }
   
   pr=head;
   p=head;
   while(p->ID!=ID && p->next!=NULL)    //找到对应ID的节点
   {
      pr=p;
      p=p->next;
   }
   if(p->ID==ID)
      return p;
   else
   {
      printf("\nCan't find the node!\n");   
      return NULL;
   }
   
   
}


void ShowAll(Fnode *head)
{
   Fnode *pr,*p;
   FILE * fp;
   char rch;   

   if((fp=fopen("../fpconfig/finger.dat","rb"))==NULL)   //打开数据文件
   {
      fprintf(stderr, "Can not open finger.dat!\n");  //用shell文件调用就是这里报错,直接运行没问题
      return;
   }   
   rch=fgetc(fp);            //取得原来节点数
   printf("\nThe NO of the register finger is:%d",rch);
   
   printf("\n");
   if(head!=NULL && rch!=0)
   {
      pr=head;
      p=head;
      printf("Finger ID:%d\t Finger Lenth:%d\n",p->ID,p->RegLen);
      while(p->next!=NULL)    //找到对应ID的节点
      {
         pr=p;
         p=p->next;
         printf("Finger ID:%d\t Finger Lenth:%d\n",p->ID,p->RegLen);
      }   
   }
   else
      printf("NULL link!\n");
      
   fclose(fp);
}

void ClearAll(Fnode *head)
{
   Fnode *pr,*p;
   FILE * fp;
   char ch[250],rch;   
   int i,num;
      
   p=head;
   while(head!=NULL)
   {
      p=head;
      head=del(head,p->ID);
   }
   
   printf("Clear all of the finger data\n");

}


      
贴这么多 c code 上来别人也搞不懂 运行时有什么错误信息?

      
C是没有问题的,已经解决了,是文件路径问题,呵呵。
#!/bin/sh
my_dir="$(pwd)"   //脚步路径
export FINGERPATH=/home/demo/fpconfig   //设置环境变量
chmod 777 /dev/ttyS0

cd  /$my_dir/demo/   #就是这个
exec /$my_dir/demo/demo