mgqw
- UID
- 44463
- 帖子
- 156
- 积分
- 358
- 在线时间
- 1 天 9 小时
|
1#
mgqw 发表于 2008-07-23 10:43
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");
}
|
|