shell脚步运行C文件操作权限问题
-
- 帖子: 59
- 注册时间: 2006-11-09 21:06
- 来自: 深圳
shell脚步运行C文件操作权限问题
我有一段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程序
为了方便我写了一个小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程序
- flumer
- 帖子: 11
- 注册时间: 2007-07-30 12:06
- 来自: Tangshan,Hebei
- 联系:
-
- 帖子: 59
- 注册时间: 2006-11-09 21:06
- 来自: 深圳
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); //清空所有链表
-
- 帖子: 59
- 注册时间: 2006-11-09 21:06
- 来自: 深圳
下面是函数实现代码,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 次。
-
- 帖子: 59
- 注册时间: 2006-11-09 21:06
- 来自: 深圳
- BigSnake.NET
- 帖子: 12522
- 注册时间: 2006-07-02 11:16
- 来自: 廣州
- 联系:
- BigSnake.NET
- 帖子: 12522
- 注册时间: 2006-07-02 11:16
- 来自: 廣州
- 联系:
-
- 帖子: 59
- 注册时间: 2006-11-09 21:06
- 来自: 深圳
谢谢楼上的大侠这么热心,文件在不在的问题我都考虑到了,函数代码也都作了相应的处理,比方说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!
- flumer
- 帖子: 11
- 注册时间: 2007-07-30 12:06
- 来自: Tangshan,Hebei
- 联系:
//我的机子上没有ttyS0呀,而且这些设备都没有执行呀!
我用exec试了一下我编的C程序(没文件操作)按Ctrl+Z无法退出,
这说明用exec时外界无法发出信号与其(exec)更不要说文件操作了。
你的代码绝对没问题
把脚本改成
用的source指令,
问题可能被解决了。
(老哥C挺牛嘛,前两日找老师刚弄懂点数据结构,交个朋友,切磋切磋)
disadone@hotmail.com
我用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
-
- 帖子: 59
- 注册时间: 2006-11-09 21:06
- 来自: 深圳
呵呵,我这个东西外接了一个串口设备,ttyS0就是这个串口设备,用来读取数据的,但是这里的问题明显不是串口设备的问题。
数据结构这个东西我当年开始学的时候也是云里雾里,慢慢就体会到了。
用你那种方法改了,还是一样的不能操作文件,其实我最开始的时候用的方法跟你一样:
调用后在终端报错还是一样,不能对文件进行读写操作,也不能新建文件。
数据结构这个东西我当年开始学的时候也是云里雾里,慢慢就体会到了。
用你那种方法改了,还是一样的不能操作文件,其实我最开始的时候用的方法跟你一样:
代码: 全选
/$my_dir/demo/demo #应该跟你那个原理一样,你那个shell我也实验过了效果一样,直接运行C程序
代码: 全选
Creat finger file!!!!!!!!!!!!!
Can not open finger.dat to add!
Press "Enter" to continue...
- yingfei
- 帖子: 273
- 注册时间: 2007-09-03 18:34
- 来自: 羊城通
fp=fopen("../fpconfig/finger.dat","rb"))==
问题在这个两个 . 上。 用shell 执行的时候,当前目录里可是没有 ../fpconfig/finger.dat 这个路径和文件的,当然会出错。
可以 这样:
问题在这个两个 . 上。 用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
-
- 帖子: 59
- 注册时间: 2006-11-09 21:06
- 来自: 深圳
用楼上的方法解决问题了!!!!!!!!谢谢了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的两个点上!