トップページ⇒tech
1001コメント307KB

UNIXプログラミング質問すれ Part2

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
UNIXおよびUNIX clone環境一般のプログラミングに関する質問スレッド

前スレ:
UNIXプログラミング質問すれ
http://pc2.2ch.net/test/read.cgi/tech/992057422/

>>2 関連スレ
0002デフォルトの名無しさんNGNG
関連スレ
Cygwin使っている人いますか? その8
http://pc.2ch.net/test/read.cgi/unix/1047489645/
Cygwin使っている人いますか? Part2
http://pc2.2ch.net/test/read.cgi/win/1052361218/

関連板
http://pc.2ch.net/unix/
http://pc.2ch.net/linux/
0003デフォルトの名無しさんNGNG
3
0004デフォルトの名無しさんNGNG
http://www.twc-wrestle.com/inoki.html
0005デフォルトの名無しさんNGNG
乙。
無理に埋立することもなかったんじゃないかとは思うけどな。
0006デフォルトの名無しさんNGNG
初歩的な質問で恐縮ですが質問させてください。m(_ _)m
gccでのCのプログラムを書いてるのですが、ログインユーザのホームディレクトリと、
実行ファイルのあるディレクトリパスを取得したい場合どのようにすればよいのでしょうか?
# チルダをつけるとホームのファイルを開けるのかと思ったのですが駄目でした…。
0007デフォルトの名無しさんNGNG
環境変数HOMEから取得
00086NGNG
>>7さん
環境変数HOMEで取得できました。
実行ファイルの方は自分で調べようと思います。
レスありがとうございました。m(_ _)m
0009デフォルトの名無しさんNGNG
>>8
> 実行ファイルの方は自分で調べようと思います。

1. argv[0]がfull pathかどうか?
  yes → それ
2. argv[0]が'/'入りでかつ相対パスか?
  yes → getcwd と それ を連結
3. $PATHの中を順番に、argv[0]を探す。
found → それ

確か、GNU dldはこんなことをやっていた。(そこからcodeを盗んでもいい)
0010デフォルトの名無しさんNGNG
>>9
Unix系じゃ100%確実な取得方法はないね。

execve(2)の引数で簡単に嘘付けるし、
/proc見たとしてもマウントされてない可能性もある。
chroot(2)なんかした日にゃ、そもそもパスが無意味。

そんなの気にする必要はまったくないがw
0011デフォルトの名無しさんNGNG
FAQ的には、「気ニスルナ!」が正解。
どっかのFAQにそんな記述があった。
0012ヽ(´ー`)ノNGNG
てーか、フルパスが知りたい時ってどんな時?
0013デフォルトの名無しさんNGNG
Windowsと勘違いした香具師がプログラミングしてるとき、かな。
0014デフォルトの名無しさんNGNG
C++のライブラリをdlopenから使いたいんですが、
クラス関数の呼び出し規約とか載ってるサイトないですか?
0015デフォルトの名無しさんNGNG
>>6
getpwnam(3)
0016デフォルトの名無しさんNGNG
C++のsource codeで、
extern "C" T1 F(T2 arg1) {
    // C++を呼び出すんじゃー
};
とwrapper関数を定義して、Cのprogramから使う。

Cのsource codeで、
    extern "C++" {
        // C++を呼び出すんじゃー
    }
とlinkageを指定して呼び出す。

いじょ

あ、それスレ違いな。
0017デフォルトの名無しさんNGNG
>>16
> Cのsource codeで、
>     extern "C++" {
>         // C++を呼び出すんじゃー
>     }

できんだろ。
0018デフォルトの名無しさんNGNG
extern "Lisp" {
     // Lispを呼び出すんじゃー
}
001914NGNG
C言語での方法は知ってます。
0020デフォルトの名無しさんNGNG
extern "Java" {
     // Javaを呼び出すんじゃー
}
extern "C#" {
     // C#を呼び出すんじゃー
}

なんか最強だなおい
0021デフォルトの名無しさんNGNG
>>12
SIGHUP を受けたときに再起動して、設定ファイルを読み直すとき。
0022デフォルトの名無しさんNGNG
>>21
execve("自分のパス", ...);とかやるわけ?
0023デフォルトの名無しさんNGNG
UNIXでは設定ファイルのパスは通常ハードコードだよ
必要ならconfigureのオプションで変更。
そもそも設定ファイルはバイナリとはかけ離れた位置にあるのが
普通なのに自分の位置なんかわかって役に立つのか?
0024デフォルトの名無しさんNGNG
>>21
それもやっぱり絶対パスでハードコード推奨だろうな。
とくにsuidなんかだと、ファイル名のような外部から与えられるものは危なすぎる。
0025ヽ(´ー`)ノNGNG
>>21
そういう使い方は目からウロコだった。アリガトン。
0026デフォルトの名無しさんNGNG
>>23
あんた何言ってんの?
0027デフォルトの名無しさんNGNG
curses ライブラリについて質問なんですが、標準入力をパイプでつなぐと
getch がパイプから入力をとってきてしまいます。
しかし less は標準入力からデータをもらいつつ、かつキーボードからも入力を
受け付けますよね。こういうことは curses ではできないのでしょうか。
0028デフォルトの名無しさんNGNG
>>27
まずlessってパイプとキー入力を同時に受けつけてるの?
main()
{
 int buf;
 while((buf=fgetc(stdin))!=EOF){
  fputc(buf,stdout);
 }
}

これだけでも、パイプからの入力中にいくらキーボード叩いても、
ごちゃまぜにはならんが。
0029デフォルトの名無しさんNGNG
>>28
moreの逆戻りが出来る版ですよ。
003027NGNG
>>28
パイプとキー入力を同時に受けつけてるか分かりませんが(tail -f file | less
とかやるとちょっとおかしくなる)、パイプつないでキー入力を受けつける方法が
分からないんです。
0031デフォルトの名無しさんNGNG
dupでうまくできないかな?
0032デフォルトの名無しさんNGNG
less は別途 /dev/tty を開いてるんじゃないの?
0033デフォルトの名無しさんNGNG
ごちゃごちゃ言う前にソース見るのが早い気がした。
0034デフォルトの名無しさんNGNG
つーか、/dev/ttyじゃなくて、stdinを入力対象とするcurses library,
そんなもん存在するの? 一体なぜ???

>>28
あんた、何言ってんの?
003527NGNG
>>34
よく分かりませんが getch って stdin 読むものじゃないんですかね。
echo j | ./a.out
で ./a.out して j 押したのと同じ状態になります。その後キー入力効きませんが。
0036デフォルトの名無しさんNGNG
>>35
ごちゃごちゃ言わんとソース読め。嫌ならUNIXなんぞさっさと止めてしまえ。
0037デフォルトの名無しさんNGNG
>>35
getch()なんて関数どこにある?
0038デフォルトの名無しさんNGNG
>>37
cursesて知ってる?

lessのソース眺めたけど、やっぱ/dev/ttyを開いてたね。
0039デフォルトの名無しさんNGNG
陰湿
0040デフォルトの名無しさんNGNG
ファイル入出力でやっている
カーネルバッファリングのバッファサイズを0にするために,
ioctl関数をどのように使用すればいいですか?
0041デフォルトの名無しさんNGNG
OSによる。環境書けよ。

つうかioctlでread/writeのバッファサイズの変更なんてできるのか?
そもそもファイルシステムに依存するぞ。

もしstdioのことを言ってるならバッファリングはカーネルでなく
ライブラリがやってる。man setbuf すれ
0042デフォルトの名無しさんNGNG
>>41
すいません.

OS: Redhat 9.0

ユーザバッファリングではなく
カーネルバッファリングです.

ioctlでできるそうなんですが
以下のサイトでできると書いてあるんですが
やりかたがわからないんです.
ttp://search.luky.org/linux-users.6/msg07811.html
0043デフォルトの名無しさんNGNG
fflushする代わりにって言ってるんだからstdioのことで、
setbufで必要十分だろ。ioctlなんて使わないよ。
何がしたいの? なぜioctlにこだわるの?
0044デフォルトの名無しさんNGNG
>>42
まずカーネルバッファリングとか不明確な単語は使わないほうが良い。
それからファイル入出力じゃなくて端末出力でしょ。
さらにioctlはドライバ毎に用意されるものでドライバI/Fを調べるのが普通。

で、TTYドライバに対する設定はlinuxの場合は以下のURIでできるようだが
バッファサイズ変更の機能は見つからない。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/termios.3.html
元ネタが嘘?
0045デフォルトの名無しさんNGNG
>>26
日本語が読めないんですか?
0046デフォルトの名無しさんNGNG
>>44
元ネタはinをrawにすれって事じゃないのか?
0047デフォルトの名無しさんNGNG
>>45
>>21,22の意味が分からないの?
004840NGNG
>>43 43
うちの師匠がioctlでできるはずだから
やっておけって言われたものですから.

目的はwrite/readは
カーネルでバッファ(ブロック?)に溜めて,
溜まったら出力しますよね?
そのバッファサイズを0にすれば使用するマシンの
ファイル入出力に掛かる正確な時間が計れるのではと言われました.
わかりにくい文ですいません.
0049デフォルトの名無しさんNGNG
O_SYNCとかそういう話か?
0050デフォルトの名無しさんNGNG
writeした後にfsyncでもすれば?
005140NGNG
>>49 50
それも考慮しましたが,
師匠がいってるのでioctlにこだわりを.
すいません.
0052デフォルトの名無しさんNGNG
師匠にいわれたら死ねるのか?
005340NGNG
>>52
それはいいすぎでしょう.
0054デフォルトの名無しさんNGNG
>>51
と、言うか普通に師匠に聞けばいい話だと思われ。
0055デフォルトの名無しさんNGNG
>>48
言ってること滅茶苦茶だな。
ファイルIOなら >>49 がお望みのものじゃないの?
ただし、それで計った値に意味があるかは別だけどな。
師匠も師匠なら弟子も弟子・・・。
0056デフォルトの名無しさんNGNG
>>48
> そのバッファサイズを0にすれば使用するマシンの
> ファイル入出力に掛かる正確な時間が計れるのではと言われました.

fsyncにしてもO_SYNCにしても、
いつもの入出力のやり方と違うわけだが、そんな調査でもいいのか?
005740NGNG
マシンごとにバッファのサイズが違うために
マシン毎の性能を性格に計測するためには
バッファサイズを同じにしなければならないらしいです.
0058デフォルトの名無しさんNGNG
C++のライブラリをdlopenから使いたいんですが、
クラス関数の呼び出し規約とか載ってるサイトないですか?
知りたいのはC++製のsoライブラリへのアクセス方法で、
Cの場合については判ってます。
0059デフォルトの名無しさんNGNG
シングルユーザーモードにして、
巨大ファイルコピー;syncを数回実行して平均を出すべきだろうね。
# cp TESTDATA /mnt/target;sync;sync
実使用とかけ離れたドライブ単体の性能を測るのであれば。

実使用状態ではHDDとプログラムはできる限り並列に動作させようとして
カーネルががんばっちまう結果、
書き込み終了より先にプログラムが終了しちまう。
0060デフォルトの名無しさんNGNG
>>58
シンボルの変換方法、仮想関数テーブル、例外処理、static initializerの扱い
などがコンパイラベンダ毎にマチマチなので、コンパイラとバージョン限定
しないと話にならんと思うよ。
0061デフォルトの名無しさんNGNG
指定したディレクトリのファイルを列挙するプログラムを教えて?

※いや、サクっとできそうで本当にできなかった。カレントDirなら
列挙できたのだけど、その下がなぜか、かからない・・・libc5使ってるのだけどね。

おしえてちょ。

0062デフォルトの名無しさんNGNG
> libc5使ってるのだけどね
(´-`).。oO(…価値のある情報だろうか?)
0063デフォルトの名無しさんNGNG
>>61
再帰。スタックあふれに注意。
0064デフォルトの名無しさんNGNG
>>57
マシンごとに違うのは、バッファだけじゃないのに、
バッファだけ同じにするのは意味がわからんな。
実メモリが多いマシンには不利な条件だ。
# I/O cacheへのmemory割り当てが可変のOSに限るが。

>>58
extern "C" {
宣言;
}
した、Cのwrapper関数を定義。

>>61
FILE *f = popen("find . -print");
Cで完結したければftw(3)を。
opendir/readdir/closedir(3)使って駄目なのは、頑張れとしか(ry
0065デフォルトの名無しさんNGNG
>>64
popenの引数はひとつなの?
0066デフォルトの名無しさんNGNG
違うよ、御免よ。"r"を付け足してねん。
0067デフォルトの名無しさんNGNG
現在、無線LANでクライアントPCから数ミリsecでリアルタイムにデータ受信をしていますが、
サーバPCからキー入力をして無線LANを使ってクライアントPCに文字信号を送信したいと思っています。
どのようにしたらリアルタイムキー入力ができるのか教えてください。
ちなみにsysytem("stty raw");関数を使ったらキー入力待ち状態になりリアルタイムデータ受信が止まってしまいました。
OSはlinuxです。よろしく御願い致します。
0068デフォルトの名無しさんNGNG
>>67
RealtimeのOSに変えたらどうだ?
0069デフォルトの名無しさんNGNG
>>67
・O_NONBLOCKでopenする
・poll/selectでデータがある事を確認する
・スレッドで入力待ち

>>68
単純に変えても同じ事になるぞ。
0070デフォルトの名無しさんNGNG
>>69
数ミリsecでリアルタイム処理できないOSだと指摘してるだけでしょ。
受信処理だけでたまたまリアルタイム処理できていたとしても
送信処理が入ることでダメになる可能性もある。
0071デフォルトの名無しさんNGNG
リダイレクトを取得する方法は?
たとえば ls とうって、その結果の標準出力を受け取る方法。

自分は今のところ、泥臭い方法で
system( "ls > ./tmp" ); みたいにテンポラリに吐き出して
それをあとから参照する方法使ってるけど、なんだかねぇーという
感じで
0072デフォルトの名無しさんNGNG
>>71
>>64-65
0073デフォルトの名無しさんNGNG
>>68=>>70
恥ずかしいやつ
0074デフォルトの名無しさんNGNG
>>47
>>23,24が読めないんですね。
0075デフォルトの名無しさんNGNG
>>71
>>64-65

をー!そうやってやるのか!サンクス
0076デフォルトの名無しさんNGNG
ソフトリアルタイムとハードリアルタイムの違いが分からないんですな。
0077デフォルトの名無しさんNGNG
>>42
結局URLにあるioctlのやりかたって
どうやるの??
0078デフォルトの名無しさんNGNG
>>77
脳内
0079ageNGNG
質問です。
Linux gcc で実行ファイル(自分自身)があるディレクトリを
知りたいんですが、どうやるんでしょうか。
0080デフォルトの名無しさんNGNG
>>79 無理。
0081デフォルトの名無しさんNGNG
>>79
procfsが有効なら、/proc/self/exeをreadlink(2)してdirname(3)。
008277NGNG
>>44
おそらく端末i/oじゃなくて
ファイルi/oだから違うでしょ
システムコールに関する本を読むと
カーネルバッファリングって記述はあって
やりたいことはわかるけど、
どうやるかは不明。
008379NGNG
>>81
大変遅くなりました。
あっしも >>80 さんと同じに考えてましたが
教えて頂いた方法でできました。
ありがとうございました。
0084デフォルトの名無しさんNGNG
こんなコードがあったもので、質問です。

fd = open("/dev/hdc1", O_RDWR);
…
fdatasync(fd);

これで/dev/hdc1の全てのキャッシュされたファイルについて同期がとれますか?
0085デフォルトの名無しさんNGNG
PerlかRubyでシェルもどきを作りたいのですが、
いい例、解説サイトはありますか?
0086デフォルトの名無しさんNGNG
Perlの例は知らないが、Rubyだとirbshってのがある。
0087デフォルトの名無しさんNGNG
PerlやRubyをなめるな。もどきじゃなくて本物がつくれる。
0088デフォルトの名無しさんNGNG
>>84
ファイルつーかファイルの中身な。ファイルの属性の同期はとれない。
実装されてないシステムもある。(関数は呼び出せるのに:-)
008984NGNG
>>88 サンクスです。
動くかどうか気いつけて使え、ということですな。
つーことは、一般的には使わんほうがええですな。
009085NGNG
自作のツリー状データ構造上でcdとかlsをしたいのですが
ファイル名に空白が入っていた時の対処とかいろいろ行き詰まってしまって・・・
0091デフォルトの名無しさんNGNG
'や"で囲んで入力させればいいと思うけど
0092デフォルトの名無しさんNGNG
ふつう、カーネルにバッファリングされたくなかったら raw デバイスを
使うでしょ。これなら、どの UNIX でも通用する。
linux も kernel 2.4 以降なら、raw コマンドを使って raw デバイスを
割り当てられるよ。
もっとも、パーティションを直に読み書きすることになるから、書き込み
書き込みに関しては、未使用のパーティションがないとテストできないが。

あと、xfs なら O_DIRECT も使えるかもしれん。
009384NGNG
>>92
私に対するレスですよね?
バッファリングされたくないというのではなくて、
任意時点で同期をとる意図をもった他人のコードにああいう記述があったので、
質問してみたわけです。

とはいえ、>>92のレスは私にとっての示唆に富んでいました。
ありがとうございます。
0094質問ageNGNG
質問です。
Linux g++ で pthread を使ってみたいんですが、
thread の実装(C++化?)ってどうやってます?
すでにあったらメンゴです。
0095デフォルトの名無しさんNGNG
腐るほどあるんじゃない?
0096デフォルトの名無しさんNGNG
>>94
#include <boost/thread.hpp>
009794NGNG
>>96
boost ライブラリですか。
検索してもあまり見つからないですね。
RedHat 用 rpmがあったんで、ちょっと試してみます。
ありがとうございます。
0098デフォルトの名無しさんNGNG
Linuxのシステムコールって、int呼び出しだったのか!
ちょっと昔のMSDOSを思い出して感動した!
0099デフォルトの名無しさんNGNG
ユーザモードからカーネルモードにする手段は限られてるから、
まぁ大抵intになると思うが。

#BSD/OSはillegal instruction使ってたかも。
0100デフォルトの名無しさんNGNG
>>98>>99
WindowsもFreeBSDもINT呼び出しだよ。引数の扱いがLinuxと違うけど。

Windows NT/2000/XPがINT 2EHで、FreeBSDがLinuxと同じINT 80H。

SolarisやUnixwareはコールゲート。
0101デフォルトの名無しさんNGNG
はつみみです
■ このスレッドは過去ログ倉庫に格納されています