免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3046 | 回复: 7
打印 上一主题 下一主题

请教:PERL来生成文本数据最安全的方法?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-10-01 21:08 |只看该作者 |倒序浏览
最近用PERL写一个纯文本的留言板,但是数据常常发生丢失,PERL生成的文件如aa.dat有时会莫名其妙被系统[unix]删除,非常苦恼。

可以肯定的是,不是程序有问题。难道是系统的问题,或者PERL有什摩好的方法,所以想请教。

我已经把属性改为400,都不行!

PERL有什麽最安全的方法来生成这些文本数据呢??

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-10-02 08:46 |只看该作者

请教:PERL来生成文本数据最安全的方法??

1.加上lock....
  避免同時有兩個人access同一個文本..
  只是如果使用量大,就會有人跟你抱怨,他不能貼東西...
  不加lock..只要同時有兩個人以上,access文本就有可能把文本內容刪除..
  我曾經經歷過...莫名其妙文件就不見了...所以後來改用其他方式..
  猜測應該是同時有兩三個人access那的文本...其中有人出問題..造成
文本不見了...
2.利用directory與對方id+目前時間,directory名稱為日期...
  將文本名稱利用(user id + time())儲存..分開儲存...
   好處是兩個人可一同回覆文章..可保證不會因為兩個人同時access
   一個人出錯..造成文本刪除的問題...但是數量很大的時候,
   會很慢..
3.還是建議用database..:)

论坛徽章:
0
3 [报告]
发表于 2003-10-02 11:46 |只看该作者

请教:PERL来生成文本数据最安全的方法??

啊,原来是这样,真是非常感谢apile老大

论坛徽章:
0
4 [报告]
发表于 2003-10-02 23:49 |只看该作者

请教:PERL来生成文本数据最安全的方法??

#####我一直是这样用的文件锁,大家帮看看
$LOCK_EX = 2;
$LOCK_UN = 8;
open( TITLES, ">;>; $_data_path/forums$FORM{class}/$FORM{'forum'}/index" );
    flock( TOPIC, $LOCK_EX );
    print TITLES @test;
    print TITLES "$new_id\n";
    flock( TOPIC, $LOCK_UN ) ;
    close(TITLES);

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2003-10-03 08:25 |只看该作者

请教:PERL来生成文本数据最安全的方法??


  1. # Lock相關設定值
  2. $RetryNum = 100; # 重試回數
  3. $Interval = 0.1; # 重試的間隔時間
  4. $EX_LOCK = 2;    # 排他鎖定
  5. $UN_LOCK = 8;    # 解除鎖定
  6. $LOCKTYPE = $EX_LOCK;   # 鎖定格式為排他鎖定
  7. $useflock =  0;         # 使用flock()時設定值為1
  8. $Lprefix = 'L-';        # 鎖定檔案的字首
  9. #
  10. # lock(lfh,lockfile);
  11. # <IN>; lfh: 鎖定檔案的指標(相當於openLock指定的檔案名稱)
  12. #      lockfile :鎖定的檔案名稱
  13. # <OUT>; true:成功 false:失敗
  14. sub lock($$)
  15. {
  16.   my($lfh,$lockfile) = @_;
  17.   if($useflock){
  18.      flock($lfh,$LOCKTYPE);
  19.      return 1;
  20.   }
  21.   else{
  22.      my ($retry) = $RetryNum;
  23.      while(-f $lockfile) {
  24.          select(undef,undef,undef,$Interval);
  25.          return undef if(--$retry <=0);
  26.      }
  27.      return open($lfh, ">;$lockfile");
  28.   }
  29. }
  30. #
  31. # unlock(lfh,lockfile)
  32. # <IN>; lfh :鎖定檔案的指標(相當於以openLock指定的檔案名稱)
  33. #     lockfile:鎖定檔案名稱
  34. # <OUT>; 無
  35. sub unlock($$)
  36. {
  37.   my($lfh,$lockfile) =@_;
  38.   if($useflock){
  39.       flock($lfh,$UN_LOCK);
  40.   }
  41.   else{
  42.      close($lfh);
  43.      unlink($lockfile);
  44.   }
  45. }

  46. #
  47. # openLock(fh,modefile)
  48. # <IN>; fh :指標
  49. #     modefile: 包含模式的檔案名稱
  50. #<OUT>; true of false
  51. sub openLock(*$)
  52. {
  53.    my($fh,$modefile) = @_;
  54.    my($lockf);
  55.    ($mode,$file) =    ($modefile=~/^(\+?(?:<|>;>;?)\s*?)(.+)$/);
  56.    if($file =~/(\/|\\)/){
  57.       ($path,$filename) = ($file=~/^(.*[\/|\\])(.+)$/);
  58.    }
  59.    else{
  60.      $path = "";
  61.      $filename =$file;
  62.    }
  63.    return undef unless $filename;
  64.    $lockf = $path.$LPrefix.$filename;
  65.    lock($filename,$lockf) or return undef;
  66.    open($fh,$modefile)
  67.        or unlock($filename,$lockf), return undef;
  68.    return 1;
  69. }

  70. #
  71. # closeUnlock
  72. # <IN>;  fh:指標
  73. #      modefile:包含模式的檔案名稱
  74. # <OUT>; 無
  75. sub closeUnlock(*$)
  76. {
  77.   my($fh,$file) = @_;
  78.   if($file =~/(\/|\\)/) {
  79.       ($path,$filename) =      ($file=~/^(.*[\/|\\])(.+)$/);
  80.   }
  81.   else{
  82.      $path ='';
  83.      $filename = $file;
  84.   }
  85.   my($lockfile) = $path.'L-'."$filename";
  86.   unlock($filename,$lockfile);
  87.   close($fh);
  88. }
复制代码


某本書上看到的..他用了兩種方法...做lock
一種是多建立一個lock file
一種是用flock

有興趣的自行研究..可能有bug..因為我照書上抄的
而書的例子常常會出問題...:)

论坛徽章:
0
6 [报告]
发表于 2003-10-07 21:03 |只看该作者

请教:PERL来生成文本数据最安全的方法??

好棒啊,i like it

论坛徽章:
0
7 [报告]
发表于 2003-10-08 12:54 |只看该作者

请教:PERL来生成文本数据最安全的方法??

继续问个问题,文件锁在windows NTFS文件系统环境下是否可靠呢?
如果代码写成这样:
flock( TOPIC, $LOCK_EX )or die"文件加锁失败";
print TITLES @test;
print TITLES "$new_id\n";
flock( TOPIC, $LOCK_UN ) or die"文件解锁失败";

在FAT32文件系统会报错,但在NTFS下正常,返回值是1 ,是不是说明ntfs格式下文件锁很有效呢?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2003-10-08 13:40 |只看该作者

请教:PERL来生成文本数据最安全的方法??

flock FILEHANDLE,OPERATION

    Not implemented (Mac OS, VMS, RISC OS, VOS).

    Available only on Windows NT (not on Windows 95). (Win32)
看..perlport
>; perldoc perlport

裡面有上面這一段...flock只有implement在windows NT上..
default是 NTFS...而FAT32..因為FAT Table配置不同..
所以應該無法使用才對...
以上只是我的猜測..上google上找也許可以看出端擬.

;剛剛看了一下google..
FAT32似乎也可以使用flock才對...、
你要不要試試看
use Fcntl qw(:flock);
然後直接使用 LOCK_EX、LOCK_UN、LOCK_SH
在flock後面...win32平台沒用過...:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP