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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
p
0153デフォルトの名無しさんNGNG
>>152
Unixでは拡張子は基本的にはファイルの種類と関係ないよ。
0154デフォルトの名無しさんNGNG
>>153
カーネルは関知しないが、
コマンドは拡張子を気にするだろ。

makeとかCコンパイラとか。
0155デフォルトの名無しさんNGNG
>>154
.cだったらCのソースで、.hだったらヘッダファイルだとでも?
0156デフォルトの名無しさんNGNG
UNIX使いなら拡張子じゃなくてsuffixと呼べやゴルァ
0157デフォルトの名無しさんNGNG
質問です。
UNIXでWin32で言うところのDLLみたいことをやりたいんですが、
LoadLibrary()とGetProcAddress()みたいな関数(とかシステムコール)は
あるのでしょうか?
0158デフォルトの名無しさんNGNG
solaris/linuxなら man dlsym か
他は知らね
0159デフォルトの名無しさんNGNG
and man dlopen
0160157NGNG
>>158-159
ありがとうございます。それでできそうです。
0161デフォルトの名無しさんNGNG
Emacsでgdbを使うにあたって、
なにかお勧めの書籍やWebページありますか?
0162デフォルトの名無しさんNGNG
あげ
0163デフォルトの名無しさんNGNG
>>153
関係ないっつったら、他の OS でも関係ないじゃん。
0164デフォルトの名無しさんNGNG
>>161
GNU Emacsの中でのGDBの使用
http://www.asahi-net.or.jp/%7Ewg5k-ickw/html/online/gdb-4.18/gdb_17.html#SEC150
0165デフォルトの名無しさんNGNG
あげ
0166超初心者NGNG
fd = open("hogehoge", O_RDONLY);
で開いたファイルに何か入力があるまでブロックされ、入力があったら
それをシグナル等で知る事ができるような方法はありますか?
select()ではできませんよね?
Solaris7 or 8 なのですが。
0167デフォルトの名無しさんNGNG
普通にreadすれば?
0168デフォルトの名無しさんNGNG
シェルはbashです
cをつくったんですけど
ccでコンパイルできません。
どうすればコンパイルできますか?
0169ひよこ名無しさんNGNG
>>168
エラーメッセージは?

>cをつくったんですけど
ほう、yaccとか使って?
0170デフォルトの名無しさんNGNG
>>169
>エラーメッセージは?
「そのようなコマンドはありません」でした

linux初心者でcを勉強しようといれてみたんですが・・
cc test.c な感じです。。
0171ひよこ名無しさんNGNG
>>140
gccは?
学校ではSolarisさんか?
0172デフォルトの名無しさんNGNG
会話の意味が解らんw
0173デフォルトの名無しさんNGNG
>>171
いえ、借りてるサーバーがSolarisです。telnetでよく遊んでいます
自宅の環境はredhat7.2です
gccもコンパイルのソフトでしょうか
のちほど試してみます
0174デフォルトの名無しさんNGNG
gccでもダメでした・・
0175デフォルトの名無しさんNGNG
いったいLinuxで何してんだか。
0176超初心者NGNG
>>167
すみません、ちょっと書き方が悪かったのですが、
やりたいこういうことです。

hogehogeというファイルにあるプログラムからログが書かれる。
それをほぼリアルタイムに表示したい。
tail -f のようなポーリング式にはしたくない。

という事をしたいのですが、良い方法ありますか?
0177デフォルトの名無しさんNGNG
>>174
find -n gccとかで探してみて(スイッチ-fかも)。
0178デフォルトの名無しさんNGNG
>>174
locate gccで探してみた?
gccにパスが通っていないってのはちょっと珍しいかも。
それともコンパイルエラー?
0179178NGNG
レスさんくすです
>>177>>178
後ほど試してみます。

余談ですが、インストールするときにワークステーションの設定で
インストしたんですが、デフォルトではいってますでしょうか?(コンパイラ
もしかしたらインストールされてないのかなっておもったり
0180デフォルトの名無しさんNGNG
http://saki.2ch.net/____vip/
入れない2chVIP板。
0181デフォルトの名無しさんNGNG
>>176
SIGIOって通常ファイルに対して使えたっけ?
0182超初心者NGNG
>>181

それはどうやって使えば良いのでしょうか?
すみません、ほんとに初心者なのです。
0183デフォルトの名無しさんNGNG
UNIXのプログラミングは
まずは『詳解UNIXプログラミング』を覚えてからでないと
ダメですか?
0184デフォルトの名無しさんNGNG
>>179
>ワークステーションの設定でインスト
うん、おれんとこもそう。だけどコンパイラはデフォで
入ってるし、パスも通ってる。というより、あえて外そう
としないかぎりインストールされるでしょ。gccって。
0185デフォルトの名無しさんNGNG
183。
ちなみにこの本でUNIXが何なのかを頭に叩き込むのがいい、
とかどっかに書いてありました。
0186デフォルトの名無しさんNGNG
この本とっても他界よ!
0187デフォルトの名無しさんNGNG
>>186
でも他にまともな本がない・・・
0188デフォルトの名無しさんNGNG
>>183
ttp://www.jks.is.tsukuba.ac.jp/~daiki/func/man7/signal.7.html
あまり参考にはならないかもしれないけど、資料として。
どう使えばいいかまでは書いてないから、適切な書籍を買うなり
して、SIGNALについて勉強すればいいんでない。
0189デフォルトの名無しさんNGNG
ごめん、間違えた。>>183ではなくて>>182だ。
0190132NGNG
>>189
どうもです。
勉強する糸口が見えてきました。
が、しかし、Linux には fcntl(2) のコマンドとして F_SETSIG という
のがあってこれを使えば指定したファイルディスクリプタから入力が可能
になった時点でシグナルハンドラが呼ばれるようなのですが、Solarisには
F_SETSIGやそれに相当するものがありません。他に方法はあるのでしょうか?
0191デフォルトの名無しさんNGNG
だいたい表示とか、プログラムから書き込まれるタイミングとかによるけど。
たとえば1msに1バイトずつ書き込まれるものを一個一個読み込みたいってわけ
じゃないだろ?
だったらポーリングで充分じゃなかろうか。
0192デフォルトの名無しさんNGNG
>>190
$ man streamio
そしたらば、I_SETSIGやSIGPOLLをサーチすれ

>>166
select(2)じゃあ、EOFにも反応しちゃうね。しなきゃしないで困るし。>EOF
0193132NGNG
>>192
ウォー!!サンクスです。
ioctl(2)で出来るんですね。docs.sun.comのマニュアル見たらなんか行けそうな
気がしてきました。今手元にはCygwin(藁しかないので明日試してみます。
0194デフォルトの名無しさんNGNG
>select(2)
(2)って何ですか?
0195デフォルトの名無しさんNGNG
manしないの?
0196デフォルトの名無しさんNGNG
$man 2 select

ところでみなさん、Solaris、*BSD*、Linuxと
いろいろな環境をどのようにマスターされました?
やっぱり自分で実際に使ってみたのでしょうか?
0197196NGNG
上のは当然、オペレーションの話じゃなくてAPIのことです。
0198デフォルトの名無しさんNGNG
aioread(3AIO)なんかも美奈代。7 or 8ってことだから。
使わなくて平気だろうけど、面白いよ。
0199デフォルトの名無しさんNGNG
>>196
よくいわれるけど、システムコール他は、他人が使ってるの見るのが一番いいよ。
少なくとも「完全に動作する実例」だし。

fileutils の中の部分とか、小さいアプリのソース読みまくる。
ハックしまくる。壊しまくる。
うっかり、make install してしまって、ls,cp できなくなってハマる。
他所のサーバに connect しまっくてあせる。
0200デフォルトの名無しさんNGNG

for (i = 0; i < 10; i++)
used[i] = NO;
for (E = 0; E < 10; E++) {
if (used[E])
continue;
used[E] = YES;
for (L = 0; L < 10; L++) {
if (used[L])
continue;
used[L] = YES;
for (S = 0; S < 10; S++) {
if (used[S])
continue;
add( 0, E, L, S, c1);
add(c1, S, L, E, c2);
used[S] = YES;
for (A = 0; A < 10; A++) {
if (used[A])
continue;
used[A] = YES;
for (M = 0; M < 10; M++) {
if (used[M])
continue;
add(c2, A, A, M, c3);
used[M] = YES;
for (B = 1; B < 10; B++) {
if (used[B])
continue;
add(c3, B, B, A, c4);
used[B] = YES;
for (G = 1; G < 10; G++) {
if (used[G])
continue;
add(c4, 0, 0, G, c5);
used[G] = YES;
0201デフォルトの名無しさんNGNG
>200
宿題スレの誤爆だろ。
0202デフォルトの名無しさんNGNG
>>196
1. 少なくとも一つUNIXでは実際に使ってみる。
2. 使うどのUNIXでもmanualは徹底的に読む。
3. さもなくば、氏ぬ
0203132NGNG
Solaris7 で試して見たのですが、

fd = open("logfile", O_RDONLY);
if (fd < 0) {
perror(TARGET_FILE);
exit(1);
}
if (ioctl(fd, I_SETSIG, S_INPUT) < 0) {
perror("ioctl");
exit(1);
}

というような感じで書いて実行すると、

ioctl: Inappropriate ioctl for device

とエラーになってしまいました。
STREAMS (see intro(3)) ioctl commands となっていたので、
intro(3) を見ると、
「「STREAMS」と「ストリーム」の違いには十分気を付けて く だ さ
い。STREAMS とは、ネットワークサービスとデータ通信ドライバの
開発をサポートするカーネル機構の一種であり、...」
となっていますが、streamioは通常のファイルに対しても使えるのでしょうか?
0204デフォルトの名無しさんNGNG
>>203
だからそれが181の疑問なわけよ。
0205デフォルトの名無しさんNGNG
ビルドしたプログラムを実行するとき必ず
./a.outのように頭に./を付けますが
どうしてpathに含めないのでしょうか?
0206デフォルトの名無しさんNGNG
>>205
じゃあ含めてみれ。
0207デフォルトの名無しさんNGNG
含めたはいいが、うっかり test.c をコンパイルして大変なことになる罠。
0208デフォルトの名無しさんNGNG
含めたはいいが、うっかりgcc(中身はrm -rf /)というファイルを置いて
挙句の果てに実行パーミッションつけちゃって大変な事になる罠。
0209132NGNG
>>204
えーん、だめですか。
aioread(3)のサンプルってどこ探しても無いです。
簡単な例無いですか?
0210デフォルトの名無しさんNGNG
なんでポーリングでまずいのか小一時間。
0211デフォルトの名無しさんNGNG
SparcのSolaris付属のccって-Mオプションありますか?
0212デフォルトの名無しさんNGNG
Solarisで仕事してるひとってfork、wait使わないで、
pthread_*を使いまくりなんですか?
0213デフォルトの名無しさんNGNG
>>208
ふと思ったけど、DOSでもxcopy.bat(中身Deltree \*.* -Y)がカレントにあった場合やっぱり・・・。
0214デフォルトの名無しさんNGNG
初心者です
gccでコンパイルしました。
そうしたらディレクトリ内に変なファイルができました。
実行したいのですがどうすればよいでしょうか
0215デフォルトの名無しさんNGNG
http://www.amazon.co.jp/exec/obidos/ASIN/4894713195/
korewo anki surumade yondekara shitumon shitene!
0216デフォルトの名無しさんNGNG
高いdes!!買えませんです
0217デフォルトの名無しさんNGNG
すみません。いい方がよくありませんでした
コンパイル後にa.outというファイルがつくられました。
そして実行しようとしてa.outと打ったのですが
そんなコマンドは無いといわれました

なんと打てばよろしいのでしょうか
0218デフォルトの名無しさんNGNG
./a.out
0219デフォルトの名無しさんNGNG
ありがとうございました!やってみます
0220デフォルトの名無しさんNGNG
>>209
> aioread(3)のサンプルってどこ探しても無いです。

http://examples.oreilly.com/posix4/p4code.tar.Z
でも、aio は176の目的には使えないと思った。
ポーリングすれ。
0221132NGNG
>>220
調べていただいてどうもです。
いろいろ考えたんですけど(調べてはいないので妄想か?)ローカルディスク上
のファイルならまだしも、NFSサーバ上のファイルのI/Oの発生をカーネルが知る
のはとても難しいと思うので無理で当然かなと思いました。
素直にポーリングします。
どもありがとうございました。
0222デフォルトの名無しさんNGNG
>>213
その通り。だからDOSは糞。
0223デフォルトの名無しさんNGNG
つーか、dosなら、カレントにxcopy.batを置くのは
基本的に自分自身なわけで、それって自業自得では?
0224デフォルトの名無しさんNGNG
なんかUNIXでのスレッドプログラミング用ライブラリを見てたんだけど、
いろいろありすぎて訳分からん。だれか2,3簡単に説明してくれないかな。
説明はいいとしても何を使ってるか教えて下さい。

関連サイト
http://pc.2ch.net/test/read.cgi/unix/1010933537/
0225デフォルトの名無しさんNGNG
>>223
UNIXだって同じじゃん
0226デフォルトの名無しさんNGNG
>224
おまえが調べておれに教える!
0227デフォルトの名無しさんNGNG
>225
UNIXは多人数で同時に使えるだろ。
/tmpとか、誰でも書きこみできるだろ。
0228デフォルトの名無しさんNGNG
>227
なんで/tmpにわざわざパス通さなきゃならないんだよ。
リアリティーがないぞ。
0229デフォルトの名無しさんNGNG
やっぱSolarisかWindowsだな。PC-UNIXにはthreadは不向きだ。
0230デフォルトの名無しさんNGNG
いまはpathに . が含まれる事についての話じゃなかったのかよ。
0231デフォルトの名無しさんNGNG
>>230
そんな話は誰もしてません。気のせいです。
0232224NGNG
pthreadスレにあったNGPTとPthだけど、
Pthの方はあまりパフォーマンス的には期待できないけど、
多機能ゆえにこれ使うことにします。
NGPTはまだ安定動作の保証が取れてなさそうなので、
もう少し様子を見てからにしたいと思います。
0233デフォルトの名無しさんNGNG
もしかして一般ユーザーには関係ない話なのか?
http://www.linux.or.jp/JF/JFdocs/Path-12.html
0234デフォルトの名無しさんNGNG
>>228
/tmpに絶対chdirしないならいいけど
0235デフォルトの名無しさんNGNG
>>233
「Linuxでは、パスの評価がオペレーティングシステムコールレベル
(operating system call level)で行われていることを思い出して
下さい。実行ファイルのパスが与えられているところならどこでも、
(少なくとも) /bin、/usr/binから検索される短い名前(short name)
が与えられます - 他の場所でも同様です」

ってどういうこと?
0236デフォルトの名無しさんNGNG
>>235
原文あたってみた。

Linuxではパスの評価がオペレーティングシステムコールレベルで行われる
ことを忘れてはならない。実行可能ファイルのパスを指定するあらゆる
場所において、あなたは少なくとも/binと/usr/binで検索される省略名を
使うことができる(*)。

(*)3. 一般より抜粋
execシステムコールは、 '/' を含まないファイル名を与えられた場合に
PATH環境変数を使う。例え環境にPATH変数がなかったとしても、少なくとも
/binと/usr/binディレクトリは適合するコマンドを探して検索される。
0237デフォルトの名無しさんNGNG
>>235
PATHに ./ が入ってる場合に限った説明は「クラッカーのlsコマンドを…」のところで終わってるのかな。

「オペレーティングシステムコールレベルで」の部分は、
シェルがパスの解決をしてるんじゃないよ、って意味でしょう。

だからデーモンが foo を実行するとき、(デーモンは/bin/fooを期待している)
rootのPATHに/usr/local/bin/が入ってると、
/usr/local/bin/fooが実行されちゃうよっていうことだと思う。
0238デフォルトの名無しさんNGNG
PATH=/bin:/usr/bin:/usr/local/binの順で定義するのが
普通だから、/usr/local/bin/fooが実行されることは
ないだろう。そのへんをきっちり考慮してかかれたプログラム
だと、PATH=/bin:/usr/binって先頭で設定しなおしてから
fooを呼んでる。
0239デフォルトの名無しさんNGNG
manを.htmか.chmに変換したファイルって無いの?
0240デフォルトの名無しさんNGNG
http://www.linux.or.jp/JM/ とか。
0241デフォルトの名無しさんNGNG
>>238
>>237は>>233のページにそういうことが書いてあるって説明だ。モトネタ嫁。
0242デフォルトの名無しさんNGNG
>>236
大嘘じゃん。
PATHを見るのはexecファミリの中ではexeclp()とexecvp()だけで、
これはシステムコールじゃない。
PATHはあくまでもシェルを中心としたアプリケーション側での約束事。
カーネルはまったく無関係。
0243デフォルトの名無しさんNGNG
じゃぁ、システムコールとシェルの動作の間にあるものは、いったい何だろう…
標準関数?
0244デフォルトの名無しさんNGNG
>>238
> PATH=/bin:/usr/bin:/usr/local/binの順で定義するのが普通だから、

初耳だよ。一般ユーザはPATH=/usr/local/bin:/usr/bin:/binだろ。
rootなら/usr/localが最後でもおかしくないけど。

クリティカルなシェルスクリプトは、フルパスでコマンド指定するしな。
0245 NGNG
libc
0246デフォルトの名無しさんNGNG
>>242
なんだ普通のUNIXと一緒か。安心したよ。てかつまんないの。

>>244
一般ユーザなんだからどっちでもいいだろ。統計でもとってみれ。
0247デフォルトの名無しさんNGNG
arでライブラリを作る際、元々.aファイルがあったら、
普通はそれにオブジェクトファイル追加・更新していく事
になりますよね。

すると、あるとき何かの都合でその.aに入っていたオブジェクトを
Makefile等でのarコマンドの記述から外しても、.aを一度消さない限り、
外したオブジェクトが入りっぱなしになってしまいます。

Makefileの記述にあわせて、.aからも不要なオブジェクトを削除する
事って可能なのでしょうか?
それとも、Makefileに更新があったら、必ず.aを消すのが正しいんですか?
0248デフォルトの名無しさんNGNG
>>247
Makefile の更新なんて見ないで常に消せばいいじゃん。
libfoo.a: $(OBJS)
rm -f $@
ar cq $@ $(OBJS)
ranlib $@
みたいなかんじで。
0249デフォルトの名無しさんNGNG
>248
それだと、元々入ってるオブジェクトには変化がなくて、
内包するオブジェクトの指定が変化しただけでは更新しませんよね・・・・
0250デフォルトの名無しさんNGNG
libfoo.a: $(OBJS) Makefile
  # 以下同文
0251247NGNG
>248
>250
いや、.aファイルその物の消し方を知りたいんじゃなくて、
.aファイル内の不要になったオブジェクトを消す方法があるのか?
それとも、.aファイルその物をMakefileの更新にあわせて常に消すのが
正しい流儀なのか?という事を聞きたかったんです。

また、わざわざ指定されなくなったオブジェクトを残すようにしているのは、
何か意図があっての仕様なのか、その辺も知りたいなと。

不要なオブジェクトを残す事に特に意味がないのに、arは追加・更新しか
しないようになっていて、それゆえ.aをわざわざ指定して消さなきゃ
いけないって、奇妙ですよね。
0252デフォルトの名無しさんNGNG
>>247=251
ar dでは駄目?

>元々.aファイルがあったら、
俺はこういう前提ではやらないな。
make clean/allの時点で常に消されることを前提にしてる。
■ このスレッドは過去ログ倉庫に格納されています