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

sh/bash/dash/ksh/zsh等Shell脚本
回复
mgqw
帖子: 59
注册时间: 2006-11-09 21:06
来自: 深圳

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

#1

帖子 mgqw » 2008-07-23 10:48

我有一段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程序  
头像
flumer
帖子: 11
注册时间: 2007-07-30 12:06
来自: Tangshan,Hebei
联系:

#2

帖子 flumer » 2008-07-23 12:24

环境变量语句写全些(***编点内容)
chmod改变的什么***是从根开始,还是其他的(其他的就不对了)
程序拿来看看,可以吗?
mgqw
帖子: 59
注册时间: 2006-11-09 21:06
来自: 深圳

#3

帖子 mgqw » 2008-07-23 12:44

代码: 全选

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


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

exec /$my_dir/demo/demo
这个是shell脚本
mgqw
帖子: 59
注册时间: 2006-11-09 21:06
来自: 深圳

#4

帖子 mgqw » 2008-07-23 12:47

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);  //清空所有链表



mgqw
帖子: 59
注册时间: 2006-11-09 21:06
来自: 深圳

#5

帖子 mgqw » 2008-07-23 12:53

下面是函数实现代码,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 次。
mgqw
帖子: 59
注册时间: 2006-11-09 21:06
来自: 深圳

#6

帖子 mgqw » 2008-07-23 12:58

这个C程序编译后在终端直接运行没有问题,对文件的打开读写操作都正常。
但是如果用shell脚步调用运行的话C程序的fopen()就不能访问数据文件了,玩linux也快两年了还不晓得里面的权限设置有这么复杂。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#7

帖子 BigSnake.NET » 2008-07-23 13:07

看看 fopen 出什么错
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
mgqw
帖子: 59
注册时间: 2006-11-09 21:06
来自: 深圳

#8

帖子 mgqw » 2008-07-23 14:02

fopen成功就返回一个文件指针,失败就返回NULL…………
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#9

帖子 BigSnake.NET » 2008-07-23 15:27

mgqw 写了:fopen成功就返回一个文件指针,失败就返回NULL…………
先测试一下那个文件在不在
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
mgqw
帖子: 59
注册时间: 2006-11-09 21:06
来自: 深圳

#10

帖子 mgqw » 2008-07-23 15:40

谢谢楼上的大侠这么热心,文件在不在的问题我都考虑到了,函数代码也都作了相应的处理,比方说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
联系:

#11

帖子 flumer » 2008-07-24 23:16

//我的机子上没有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
mgqw
帖子: 59
注册时间: 2006-11-09 21:06
来自: 深圳

#12

帖子 mgqw » 2008-07-25 8:53

呵呵,我这个东西外接了一个串口设备,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
来自: 羊城通

#13

帖子 yingfei » 2008-07-25 9:20

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
mgqw
帖子: 59
注册时间: 2006-11-09 21:06
来自: 深圳

#14

帖子 mgqw » 2008-07-25 9:31

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的两个点上!
回复