这个需要对文件加锁才能,可以用fcntl函数实现
成都创新互联专注于洮南企业网站建设,响应式网站建设,成都商城网站开发。洮南网站建设公司,为洮南等地区提供建站服务。全流程按需定制,专业设计,全程项目跟踪,成都创新互联专业和态度为您提供的服务
int lock(const char * filepath )
{
int fd = 0;
struct flock flock;
memset( flock, 0, sizeof(flock) );
fd = open( filepath, O_RDWR,S_IRUSR|S_IWUSR );
if ( fd 0 )
{
printf("open error!\n");
return ( -1 );
}
flock.l_type = F_WRLCK;
flock.l_whence = SEEK_SET;
flock.l_start = 100000;
flock.l_len = 0;
if ( fcntl( fd, F_SETLK, flock ) ) //加锁,如果失败则等待10秒
{
printf("cannot set lock\n");
printf("the process will retry after 10 seconds\n");
sleep(10); //不同版本的sleep单位可能不一样,有的是秒有的是毫秒,你自己看着改
if ( fcntl( fd, F_SETLK, flock ) ) //加锁,如果失败则退出
return( -1 );
}
return( 0 );
}
后面的你懂吧
设置状态变量lock=0,在占用资源的函数中,设置lock=1;并在处理结束后设lock=0.
比如:
bool lock=0;
int scan()
{
while(lock!=0); //循环检测,直到资源释放才执行下面的语句
lock=1;//锁定资源
... //具体的执行扫描的语句
lock=1; //释放资源
return 0;
}
这个方法容易实现,但是占用CPU,假定其他线程正在占用扫描仪,那么这个线程就会在自己的时间片内不停的执行while语句直到对方释放扫描仪。由此造成了浪费。
现在流行的做法是通过中断信号来做,那是一本书的内容,建议看linux内核编程方面的书。
#includestdio.h
#includestdlib.h
#includeconio.h
#includestring.h
void dofile(char *in_fname,char *pwd,char out_file)
{
FILE *fp1,*fp2;
register char ch;
int j=0;
int j0=0;
fp1=fopen(in_fname,"rb");
if(fp1==NULL)
{
printf("cannot open in-file.\n");
exit(1); //如果不能打开要加密的文件,便退出程序、
}
fp2=fopen(out_file,"wb");
if(fp2==NULL)
{
printf("cannot open or create out-file.\n");
exit(1); //如果不能建立加密后的文件,便退出
}
while(pwd[++j0]);
ch=fgetc(fp1); //加密算法开始
while(!feof(fp1))
{
fputc(ch^pwd[jj0?j=0:j++],fp2); //异或后写入fp2文件
ch=fgetc(fp1);
}
fclose(fp1);
fclose(fp2);
}
void main(int argc,char *argv[])
{
char in_fname[30];
char out_fname[30];
char pwd[8];
if(argc!=4)
{
printf("\nIn-fname:\n");
gets(in_fname);
printf("Password:\n");
gets(pwd);
printf("Out-file:\n");
gets(out_fname);
dofile(in_fname,pwd,out_fname);
}
else
{
strcpy(in_fname,argv[1]);
strcpy(pwd,argv[2]);
strcpy(out_fname,argv[3]);
dofile(in_fname,pwd,out_fname);
}
}
一般情况下是做不到的!
从文件本身角度是无法实现加锁的!
只能从应用程序角度去加锁,如:在C程序中进行加锁和锁检查,当然,可以不是真正意义上的锁(否则shell无法识别)。 同时,在shell进程中进行加锁的锁检查!