• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DBファイルが0644になってしまう)

DBファイルのパーミッションが0644になる問題の解決方法

shuyamakawaの回答

  • ベストアンサー
回答No.1

umask 033されているような気がします。シェルのプロンプト上で「umask」を実行すると何が表示されますか? 「033」と表示されたのであればperlスクリプトの問題の箇所の前で「umask( 000 );」としてみてください。

syg
質問者

お礼

ありがとうございます。さっそくumaskしてみると結果は「022」でした。 >$umask_old = umask; >umask(000); >tie ~; >umask( $umask_old ); で成功しました!

関連するQ&A

  • DBMの容量制限

    DBモジュールを使ってちょっとしたDBを作ってるんですが、容量制限 らしきものでひっかかってます。そう、1024byteの壁です。これを越えると sdbm store returned -1, errno 22, key "0012018" at ./hoehoe.pl line ~. と叱られてしまうのです。 他にもODBMはもちろんのこと、NDBMも試しましたが結果は同じです。 容量制限のない GDBM、DB_Fileは大丈夫でした。 しかし SDBM、NDBMは 4096byteまで大丈夫だったはず。なにか別の方法が あるのでしょうか? 今回の試しに以下のものを書いてみました。「3000」を「1000」くらいに すると通ります。DB_File、GDBMでは「3000」でも大丈夫です。 ---------------------------------------- use Config; use Fcntl; use SDBM_File; $flags = O_CREAT|O_RDWR|&BINARY; tie( %HOE, 'SDBM_File', 'hoe', $flags, 0666 ) || die "Can't open DB"; $uiui .= 'UIUI' while( 3000 > length( $uiui )); $HOE{'key'} = $uiui; untie( %HOE ); print "ok\n"; exit; sub BINARY{ return O_BINARY if( $Config{osname} =~ /^(MS)?Win/ ); }

  • 連想配列の評価

    DBより値を読込み、評価しているようですが 前任者がいないので、どう評価しているかわかりません。 -------------------------------------------------- tie(%P3, DB_File, $P3_FILE, O_RDONLY, 0444, $DB_BTREE) || die "$P3_FILE: $!"; if (defined($p3 = $P3{$wd1, $wd2, $wd3})) { ・・・ } -------------------------------------------------- これは、%P3に $wd1か$wd2か$wd3が存在したら それに対応する値を代入してから、処理を行うと 考えていいのでしょうか?

    • ベストアンサー
    • Perl
  • O_CREAT、O_TRUNC、O_WRONLYはどうして512、1024、1になる?何進数表示?

    Win2k+cygwinの環境です。 #include <unistd.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> int main(void){ int c,i,t,w; c=O_CREAT,t=O_TRUNC,w=O_WRONLY; i=(O_WRONLY | O_CREAT | O_TRUNC); printf("c=%d,t=%d,w=%d,i=%d\n",c,t,w,i); return 0; } を実行すると $ ./test c=512,t=1024,w=1,i=1537 となりました。 /cygwin/usr/include/bits/fcntl.hには #define O_ACCMODE 0003 #define O_RDONLY 00 #define O_WRONLY 01 #define O_RDWR 02 #define O_CREAT 0100 /* not fcntl */ #define O_EXCL 0200 /* not fcntl */ #define O_NOCTTY 0400 /* not fcntl */ #define O_TRUNC 01000 /* not fcntl */ #define O_APPEND 02000 #define O_NONBLOCK 04000 #define O_NDELAY O_NONBLOCK #define O_SYNC 010000 #define O_FSYNC O_SYNC #define O_ASYNC 020000 #ifdef __USE_GNU # define O_DIRECT 040000 /* Direct disk access. */ # define O_DIRECTORY 0200000 /* Must be a directory. */ # define O_NOFOLLOW 0400000 /* Do not follow links. */ となっていまして、どうして c=512,t=1024,w=1,i=1537 になるのか分かりません。8進数表になっているのかと推測して #define O_CREAT 0100 よりこれは Ox0100 (8進数表示での0100)の意味なので10進数表示に変換してみましたら 64 となって辻褄が合いません。 #define O_TRUNC 01000 に於いても Ox01000→512 #define O_WRONLY 01 に於いては Ox01→1 でこれだけは実行結果と一致しています。 どうして c=512,t=1024,w=1,i=1537 となるのでしょうか?

  • DBMのことで・・・

    現在DBMを用いて簡単なデータベースを作成しています。 どこぞのCGIゲームのように、リアルタイムにデーターベースの内容が書き換えられる(戦闘をすればお金がプラス等)ようにしたいのですが、うまくいきませんorz #!/usr/bin/perl use AnyDBM_File; use Fcntl; print "Content-type: text/html\n\n"; dbmopen(%DBM, 'id', 0666); $DBM{"baka"} = ("0<>1<>2<>"); dbmclose(%DBM); print<<"HTMLTAG"; DBを作成しました HTMLTAG tie %DBM,AnyDBM_File,"id",O_RDONLY,0666; @aaa = split(/<>/,$DBM{"baka"}); untie %DBM; print"$aaa[0]"; $aaa[0]++; とりあえずこのスクリプトで、ブラウザの更新をおすたびに表示される数字が1あがっていく(プラスされて書き換えられる)ようにしたいのですが・・・ 多分ですがゲーム等の場合、いちいちdbmopenで書き換えてないとおもうので、その方法を知りたいというわけです。 いちおうこの段階ではDB作成、DBの読み込みと表示はできています。 ご教授おねがいします。

  • O_CREAT が効かない

    my$file='test.dat'; sysopen(FH, $file, O_WRONLY|O_TRUNC|O_CREAT) || die $!; test.datが無い場合は作成されるはずですが作成されません。 サーバーの設定が原因でしょうか。 ご存知の方がいらっしゃいましたらご指摘をお願いいたします。

    • ベストアンサー
    • Perl
  • C言語によるBerkeley DB アクセスでエラー

    FreeBSD 6.1でC言語によるプログラムを書いています。 ここでデータベースにBerkeley DBを使用しているのですがputで引数エラーが出ます。 以下テストプログラムです。 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <limits.h> #include <db.h> #include <fcntl.h> #include <string.h> #include <errno.h> int main() { DB* db; DBT key, val; memset(&key, 0, sizeof(DBT)); memset(&val, 0, sizeof(DBT)); key.data = (char *)"key"; key.size = strlen((char *)key.data); val.data = (char *)"データです。"; val.size = strlen((char *)val.data); if((db = dbopen("test.db", O_CREAT | O_RDWR, 644, DB_BTREE, NULL)) == NULL) { perror("dbopen"); exit(1); } if(db->put(db, &key, &val, R_SETCURSOR) == -1) { perror("put"); exit(1); } if(db->close(db) == -1) { perror("close"); exit(1); } } 結果:put: Invalid argument マニュアルやGoogleのソースコード検索等をして調べてみたのですが、どうしても解決できません。 お分かりになる方、ぜひ御教示お願いします。

  • DB_Fileモジュールインストール失敗について

    DB_Fileモジュールがインストールできません。 環境はturbolinux server10でrpm -qa | grep db したところ、 db4-4.2.52-6がインストールされているようです。 そこでDB_Fileのインストールを試みたところ、以下のような エラーとなってしまいます。 Writing Makefile for DB_File cp DB_File.pm blib/lib/DB_File.pm AutoSplitting blib/lib/DB_File.pm (blib/lib/auto/DB_File) cc -c -I/usr/local/BerkeleyDB/include -D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE _PIDS -DDEBUGGING -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_S OURCE -D_FILE_OFFSET_BITS=64 -O2 -g -march=i586 -DVERSION=\"1.814\" -DXS_VERSI ON=\"1.814\" -fPIC "-I/usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE" -D_NOT _CORE -DmDB_Prefix_t=size_t -DmDB_Hash_t=u_int32_t version.c version.c:30:16: db.h: No such file or directory make: *** [version.o] Error 1 /usr/bin/make -- NOT OK Running make test Can't test without successful make Running make install make had returned bad status, install seems impossible なにかversion.cが何なのかが分からなくて困っています。 そもそも、DB_Fileはperlに同梱されているものと思っていましたが、、、 何が足りないのでしょう?教えてください。よろしくお願いします。

    • ベストアンサー
    • Perl
  • ファイルのロックについて

    ファイルのロック方法を下記の様にしてロックさせていますが、同時ににアクセスが合ったときにどちらかが$add_text;を書きこまれないので順次書き込まれる様にしたいのですが、何方かご教授してもらえませんか? #!/usr/bin/perl use Fcntl ':flock'; open(ADD_DB,">>$log"); flock(ADD_DB, LOCK_EX); print ADD_DB "$add_text;\n"; flock(ADD_DB, LOCK_NB); close(ADD_DB);

    • ベストアンサー
    • Perl
  • unlinkしたファイルを元に戻す方法?

    UNIX系OSでは(Windowsとかでもできるのでしょうか?) プログラム中で使う一時ファイルを、 プログラムが途中で異常終了したりした場合でも 確実に消えてなくなるように、 int fd = open( "temp.dat", O_RDWR|O_CREAT ) ; unlink( "temp.dat" ) ; というように、一時ファイルを作った直後にunlink、という手段が よく使われますが・・・ この、unlinkしてしまって、ファイルディスクリプタだけになったファイルを、 別のファイルに自力で書き写す以外に、 再びファイルとして残すことってできないのでしょうか? 要するに・・・ プログラムが途中で異常終了したりしたときは、 確実に消えてほしいけれど、 必要な場合は残したい、でも、残す処理が途中で中断したりして、 半端なファイルが残ってほしくない、 ・・・というような要件なのですが。。

  • ファイル内で重複している数と重複した回数

    開くファイルの中身は数字のみ。 1行に一つずつ数字が入っており、 それが何行にもわたり続くファイルです。 ファイル内で重複している数と重複した回数を数えたいです。 以下のようなスクリプトを使ったのですが、 結果を表示させようとすると global symbol"$hash" requires explicit package name. にエラーが出ます。 何故なのでしょうか。 use strict; # ファイルを開く my $INPUT_FILE; open ($INPUT_FILE, ">numbers.dat") or die “Can't open. \n”; # それぞれの数をハッシュキーにする。そして対応するバリューを同じ数を見つける度毎にカウントアップする。 my %hash = (); while (my $line = readline($INPUT_FILE)) { chomp $line; $hash{$line}++; } # キーでソートし、結果を表示する。 my @keys = sort keys %hash; foreach my $key (@keys) { print “$key is found $hash{$key} times\n”; } close ($INPUT_FILE) or die “can't close the file\n”;

    • ベストアンサー
    • Perl