• 締切済み

ftokが動かない?

Linux or Solaris + Cで開発しています。 msgget()で使用するため、 ftok()でキー作成したいのですが、 ftok("/export/home/aaa.txt",100); とすると 100 というキーができます。 ftok("/export/home/aaa.txt",90); とすると 90 というキーができます。 aaa.txtというファイルはちゃんと存在しています。 全く第1引数が効いていないようなのですが、原因は何でしょうか? 試しに ftok(NULL,90); としても 90 というキーができました・・・ どうすればよいのでしょうか?

  • mkob
  • お礼率36% (18/50)

みんなの回答

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.1

Debian Linux Kernel 2.6.12-1-686 gcc version 4.0.2 (Debian 4.0.2-2) で、 # include <stdio.h> # include <errno.h> # include <sys/types.h> # include <sys/ipc.h> int main(void) { key_t key; key = ftok("/tmp/tmp.c", 100); printf("key =%d, errno = %d\n", key,errno); key = ftok("/tmp/tmp.c", 90); printf("key =%d, errno = %d\n", key,errno); key = ftok(NULL, 90); printf("key =%d, errno = %d\n", key,errno); } を実行し、 key =1677819930, errno = 0 key =1510047770, errno = 0 key =-1, errno = 14 となりました。 具体的な使用システムは何でしょうか? 少なくとも、ftok(NULL, 90)はエラーになるはずですね。

関連するQ&A

  • 引数によってwhere句を切り替える方法

    PL/SQLで開発しています。 一つのテーブルで検索条件(引数)によって検索するカラムを切り替えたいのですが、 カーソルをいくつも作らず、 一つのSELECT文で書く方法ってないのでしょうか? OR条件などを使って考えたのですが、うまくいきません。。 (例) SELECT * FROM 売り上げ情報 WHERE (品番 = 引数1 OR 商品名 = 引数2) 引数が無い時は"引数1"・"引数2"がNULLになるので、 カラムがPKなどになっていれば引数が片方しかなくてもうまく動作するのですが、 制限などがかかっていなくNULLで登録されているデータが存在すると余計なデータまでとれてしまいます。 DECODEなどでカラムに存在しない値に変換しようかとも思ったのですが、 なんか不自然な気が@@; いい方法があれば教えてください。

  • 日本語ファイルの閲覧方法

    [root@cifstest ~]# ls -l /home/cifs/ -rw-r--r--. 1 1002 499 22 2月 7 21:31 2013 aaa.txt -rwxrw-rw-. 1 root 300 0 2月 7 21:07 2013 あああ.txt NASドライブ共有フォルダをlinuxにてマウントしています。(/home/cifs) マウントした/home/cifsをlsで確認した結果が上記内容になります。 aaa.txtとあああ.txtがあるのですが、 linuxターミナル(teraTerm)から、「cat あああ.txt」で中身を見ようとすると 「cat: あああ.txt: そのようなファイルやディレクトリはありません」 と表示されます。 linux(Teraterm)から、「あああ.txt」を確認する方法はないでしょうか? ご教授お願いします。

  • コマンドラインから引数を渡すことについて

    ----------------------------------------------- #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[ ]) { FILE *fin,*fout; char ss[256]; if(argc != 3){ printf("引数の数が違います\n"); exit(1); } if((fin=fopen(argv[1],"r"))==NULL){ printf("入力ファイルをオープンできません\n"); exit(1); } if((fout=fopen(argv[2],"w"))==NULL){ printf("出力ファイルをオープンできません\n"); exit(1); } while(fgets(ss,256,fin)!=NULL){ fputs(ss,fout); } fclose(fin); fclose(fout); return 0; } ----------------------------------------------- 以上のプログラム名は「tcopy.cpp」でコマンドプロンプトから実行し、ファイルをコピーするという事を行っていきます。 「aaa.txt」と「bbb.txt」の2つを用意し、「aaa.txt」の内容、 abcdef ABCDEF 012345 を「bbb.txt」にコピーしていきます。 そこで疑問なのですが、ファイルをコピーする際、コマンドプロンプトから、 >tcopy aaa.txt bbb.txt と打ち込むとコピー出来るようであり、「tcopy」、「aaa.txt」、「bbb.txt」が引数になるという事なのですが、何故この3つが引数になるのかという事と、 int main(int argc,char *argv[ ]) のargcに引数が何故代入されるかが分かりません。 後、「aaa.txt」と「bbb.txt」がargv[1]とargv[2]に何故対応しているかが分かりません。 教えていただければ嬉しいです。

  • is null のandについて(日付型)

    SQLのSELECTで困っています。 プロシージャに引数を渡してSELECTしようと考えています。 複数の日付(datetime)型の引数をand条件で結びたいです。 検索したくない場合はnullを渡す。 例) select A,B,C from XXX where A = '1' and (B = 引数 or 引数 is null) and (C = 引数 or 引数 is null) and (D = 引数 or 引数 is null) ===== B,C,D はdatetimeです。 この形ですと、B,C,D全ての引数に日付が入っていれば取得できる のですが一箇所でも引数に何もセットしないと値0件で帰ってきて しまいます。 せっかく(is null)を使用しているのに意味がありません。 良いお知恵は無いでしょうか。 よろしくお願いします。

  • C#で開発できるかどうか教えてください part1

    開発言語として、C#を選択し、GUIを作成しようと考えています。 ネットで検索しているとC#は'windows'向けというキーワードがたくさん みうけられるため、これからお話しする条件を満たすことが出来るのか 知りたくてご質問させていただきたく。 まず画面のレイアウト的な部分は抜きにして、ボタンを押した後の 処理について。 'linux'上であるスクリプトを作成しておき、そのスクリプトが一連の処理を 'linux'上でするとしてます。実行方法として、 スクリプトファイル名 引数1 引数2 である処理が流れるとします。 C#のGUIで、引数1 引数2を入力し、ボタンを押した瞬間に 'linux'のスクリプト処理が始まることを実現したいのですが できるのでしょうか? C#はwindows系ということからlinuxに連動させることができるのか どうも引っかかるのです。 よろしくおねがいいたします。

  • 文字列の比較について

    99としか書いてないファイルxxx.txtが有り、以下のようにして読み込みました。 char aaa[256]; if((fin=fopen("c:\\xxx.txt","r"))==NULL){ AfxMessageBox("読み込みファイルオープン出来ません"); return TRUE; } while((fgets(aaa,256,fin))!=NULL){ } fclose(fin); そしてstrcmpで比較したところ、1が返り等しくないと判定されます。 strcmp(aaa,"99") どうすれば等しいと判定できるようになりますか?

  • VBSでファイル名と同じフォルダを作成し、移動させる。

    はじめまして。こんにちは。ファイル名の取得、フォルダの作成、移動ができなくて困っています。 たとえばC:\testというフォルダの中にaaa1.txt aaa2.txt,aaa3,txt・・・zzz343.txtというようにファイルがランダムにあったとします。最初の3文字は英語と決まっています。そこでaaa1.txtやaaa2.txtがあればaaaというフォルダを同じ階層に作成し、aaa1.txtとaaa2.txtを新しく作成したaaaというフォルダに移動させる。これをすべてのファイルにたいして行いたいのですがどうすればいいのでしょうか? 参考になるURLやサンプルプログラムがありましたら教えて下さい。よろしくお願い致します。

  • インストール時の手動構成

    linuxとかのインストールはしたことがあるのですが、 今回はじめてSolarisのインストールをしました。(Console sessionでインストールしました) ただ、DISKの分け方が分からないのです。 1点目:overlapがわかりません。 AutoLayoutで、作成したところ、overlapというものが作成されていました。 この領域にかなりほぼ割り当てDISKサイズ全てが割り当てられているように見えるのです。 カスタマイズしようにしても、インターネットで調べてみたところ 「この領域はさわるべきではない」等書かれていました。 ==割り当てられた領域(HDD 20GB)=== File sys Size / 6461 swap 517 overlap 20449 /export/home 13507 この領域「overlap」は何のためにあるのでしょうか。正直ほぼ全領域が使用されており 可能ならば、削除して、/varとかに割り当てたいのです。 2点目:手動で割り当てるときに作成するもの Manual Layoutで作成したいのですが、 何の領域を作成すればいいのでしょうか。 ttp://www.kkaneko.com/computer/solaris/sol9.html この人のサイトを参考に、 「/」「/var」「/usr」「/usr/local」「/opt」「/export/home」 ぐらいの領域を作成しようかと思っているのですが、「overlap」はいるのでしょうか? 以上2点です。 どなたかわかるかたご教授のほうよろしくお願いします。

  • Solaris11ホームディレクトリ共有NIS

    これまで、数台のSolaris10にてホームディレクトリを共有しています。 つまり、営業、開発、デザインとかに分けて [サーバ1] /home/eigyo/eigyo1 /home/eigho/eigyo2 [サーバ2] /home/dev/dev1 /home/dev/dev2 ... /home/design/design1 /home/design/design2 また、auto_homeでは eigyo -rw,bg,soft,intr サーバ1:/export/home/eigo dev -rw,bg,soft,intr サーバ2:/export/home/dev design -rw,bg,soft,intr サーバ2:/export/home/design こんな感じで、これまで問題はなかったそうです。 やっとホームディレクトリをまとめようということで一台のSolaris11(Solaris11.1 sun4v)で 提供しようと思ったところ、 そのサーバ自体では当然各ホームはマウントされるのですが 他のSolarisで試すとホームディレクトリから下 つまり fooserver$ su - eigyo1 eigyo1@fooserver% とはなりますが、ディレクトリの内容が見えない状態です。 % ls すると何も表示されませんし、当然.cshrcも評価されません。 #Solaris11上では zfs set share=name=export_home /export/home #として、各サブディレクトリがinheritされていることは確認しました。 ふと思いついてマップを分けてみたところ、 $ cat /etc/auto_master /home/eigyo /etc/auto_home_eigyo /home/dev /etc/auto_home_dev $cat /etc/auto_home_eigyo * -rw,bg,soft,intr sol11:/export/home/eigyo/ & $cat /etc/auto_home_dev * -rw,bg,soft,intr sol11:/export/home/dev/ & 上記であればマウントできるところまで確認はしました。 (Solaris10, Solaris11, OpenIndiana) しかしお分かりのように、とてもポータブルとは思えません。 よい方法をご教授いただきたくよろしくお願いいたします。

  • viコマンドについて

    OS:solaris10(SPARC版) 質問: あるテキストファイルをviコマンドで開いてある文字だけを削除したい場合どのようにしたらいいのですか?ご教授をお願いします。 例えば: /mnt/export/home/a/b/c /mnt/export/home/d/e/f /mnt/export/home/g/h/i /mnt/export/home/j/k/l 上記4つのなかで/mnt/export/home/だけを削除したいです。

専門家に質問してみよう