当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 14 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : shell脚步运行C文件操作权限问题
帖子发表于 : 2008-07-23 10:48 

注册: 2006-11-09 21:06
帖子: 59
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
我有一段C语言代码,此段代码码的核心内容是对文件进行读写操作记录数据(对数据文件进行fwrite fread之类的操作)。而在运行此C文件需要设置一些环境变量。
为了方便我写了一个小shell脚本,这个脚本前面是设置运行C文件所需要的环境变量,最后一句话则是运行此C文件。可用shell脚本调用运行的C文件无法对数据文件进行读写操作(甚至fopen数据文件都报错),而在终端设置好环境变量后直接运行C文件则没有问题。
我估计是权限问题,终端是在su模式下调用shell脚本的,可问题依旧,不晓得怎么弄,麻烦各位大虾看看。

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

echo "Set the environment………………"
export ****PATH=/home/****/***config
chmod 777 /***

/$my_dir/demo #调用C程序  


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-07-23 12:24 
头像

注册: 2007-07-30 12:06
帖子: 11
地址: Tangshan,Hebei
送出感谢: 0 次
接收感谢: 0 次
环境变量语句写全些(***编点内容)
chmod改变的什么***是从根开始,还是其他的(其他的就不对了)
程序拿来看看,可以吗?


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-07-23 12:44 

注册: 2006-11-09 21:06
帖子: 59
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
代码:
#!/bin/sh
my_dir="$(pwd)"


export FINGERPATH=/home/demo/fpconfig
chmod 777 /dev/ttyS0

exec /$my_dir/demo/demo

这个是shell脚本


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-07-23 12:47 

注册: 2006-11-09 21:06
帖子: 59
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
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);  //清空所有链表





页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-07-23 12:53 

注册: 2006-11-09 21:06
帖子: 59
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
下面是函数实现代码,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");

}


最后由 mgqw 编辑于 2008-07-23 13:00,总共编辑了 2 次

页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2008-07-23 12:58 

注册: 2006-11-09 21:06
帖子: 59
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
这个C程序编译后在终端直接运行没有问题,对文件的打开读写操作都正常。
但是如果用shell脚步调用运行的话C程序的fopen()就不能访问数据文件了,玩linux也快两年了还不晓得里面的权限设置有这么复杂。


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2008-07-23 13:07 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
看看 fopen 出什么错


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2008-07-23 14:02 

注册: 2006-11-09 21:06
帖子: 59
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
fopen成功就返回一个文件指针,失败就返回NULL…………


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2008-07-23 15:27 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
mgqw 写道:
fopen成功就返回一个文件指针,失败就返回NULL…………


先测试一下那个文件在不在


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2008-07-23 15:40 

注册: 2006-11-09 21:06
帖子: 59
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
谢谢楼上的大侠这么热心,文件在不在的问题我都考虑到了,函数代码也都作了相应的处理,比方说AddNode函数
代码:
   if((fp=fopen("../fpconfig/finger.dat","rb+"))==NULL)   //打开数据文件 
   {
      printf("\nCreat finger file!!!!!!!!!!!!!\n\n");       //如果没有就新建数据文件  wb+就是新建文件
      if((fp=fopen("../fpconfig/finger.dat","wb+"))==NULL)   //用shell文件调用就是这里报错,直接运行没问题
      {
         fprintf(stderr, "Can not open finger.dat to add!\n");
         return NULL;
      }
   }


在终端中报错入下:
代码:
Creat finger file!!!!!!!!!!!!!

Can not open finger.dat to add!


就算是建立了还是不能反问,我就估计是权限问题了,但是弄了很久也弄不出所以然来。


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2008-07-24 23:16 
头像

注册: 2007-07-30 12:06
帖子: 11
地址: Tangshan,Hebei
送出感谢: 0 次
接收感谢: 0 次
//我的机子上没有ttyS0呀,而且这些设备都没有执行呀!
我用exec试了一下我编的C程序(没文件操作)按Ctrl+Z无法退出,
这说明用exec时外界无法发出信号与其(exec)更不要说文件操作了。

你的代码绝对没问题

把脚本改成
代码:
#!/bin/sh
my_dir="$(pwd)"


export FINGERPATH=/home/demo/fpconfig
chmod 777 /dev/ttyS0

/$my_dir/demo/./demo#如果第二个demo是程序的话



用的source指令,
问题可能被解决了。

(老哥C挺牛嘛,前两日找老师刚弄懂点数据结构,交个朋友,切磋切磋)
disadone@hotmail.com


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2008-07-25 8:53 

注册: 2006-11-09 21:06
帖子: 59
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
呵呵,我这个东西外接了一个串口设备,ttyS0就是这个串口设备,用来读取数据的,但是这里的问题明显不是串口设备的问题。
数据结构这个东西我当年开始学的时候也是云里雾里,慢慢就体会到了。

用你那种方法改了,还是一样的不能操作文件,其实我最开始的时候用的方法跟你一样:

代码:
/$my_dir/demo/demo #应该跟你那个原理一样,你那个shell我也实验过了效果一样,直接运行C程序

调用后在终端报错还是一样,不能对文件进行读写操作,也不能新建文件。


代码:
Creat finger file!!!!!!!!!!!!!

Can not open finger.dat to add!


Press "Enter" to continue...


页首
 用户资料  
 
13 楼 
 文章标题 :
帖子发表于 : 2008-07-25 9:20 
头像

注册: 2007-09-03 18:34
帖子: 273
地址: 羊城通
送出感谢: 0 次
接收感谢: 0 次
fp=fopen("../fpconfig/finger.dat","rb"))==

问题在这个两个 . 上。 用shell 执行的时候,当前目录里可是没有 ../fpconfig/finger.dat 这个路径和文件的,当然会出错。
可以 这样:

代码:
#!/bin/sh
my_dir="$(pwd)"


export FINGERPATH=/home/demo/fpconfig
chmod 777 /dev/ttyS0

cd  /$my_dir/demo/
exec /$my_dir/demo/demo


页首
 用户资料  
 
14 楼 
 文章标题 :
帖子发表于 : 2008-07-25 9:31 

注册: 2006-11-09 21:06
帖子: 59
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
yingfei 写道:
fp=fopen("../fpconfig/finger.dat","rb"))==

问题在这个两个 . 上。 用shell 执行的时候,当前目录里可是没有 ../fpconfig/finger.dat 这个路径和文件的,当然会出错。
可以 这样:

代码:
#!/bin/sh
my_dir="$(pwd)"


export FINGERPATH=/home/demo/fpconfig
chmod 777 /dev/ttyS0

cd  /$my_dir/demo/
exec /$my_dir/demo/demo


用楼上的方法解决问题了!!!!!!!!谢谢了
我明白拉,问题就出在../fpconfig/finger.dat的两个点上!


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 14 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译