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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
UNIXおよびUNIX clone環境一般のプログラミングに関する質問スレッド

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

>>2 関連スレ
関連スレ
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/
3
乙。
無理に埋立することもなかったんじゃないかとは思うけどな。
6デフォルトの名無しさん:03/06/11 23:42
初歩的な質問で恐縮ですが質問させてください。m(_ _)m
gccでのCのプログラムを書いてるのですが、ログインユーザのホームディレクトリと、
実行ファイルのあるディレクトリパスを取得したい場合どのようにすればよいのでしょうか?
# チルダをつけるとホームのファイルを開けるのかと思ったのですが駄目でした…。
環境変数HOMEから取得
86:03/06/12 00:15
>>7さん
環境変数HOMEで取得できました。
実行ファイルの方は自分で調べようと思います。
レスありがとうございました。m(_ _)m
9デフォルトの名無しさん:03/06/12 00:51
>>8
> 実行ファイルの方は自分で調べようと思います。

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

確か、GNU dldはこんなことをやっていた。(そこからcodeを盗んでもいい)
>>9
Unix系じゃ100%確実な取得方法はないね。

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

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

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

いじょ

あ、それスレ違いな。
>>16
> Cのsource codeで、
>     extern "C++" {
>         // C++を呼び出すんじゃー
>     }

できんだろ。
extern "Lisp" {
     // Lispを呼び出すんじゃー
}
1914:03/06/21 17:28
C言語での方法は知ってます。
extern "Java" {
     // Javaを呼び出すんじゃー
}
extern "C#" {
     // C#を呼び出すんじゃー
}

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

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

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

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

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

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

OS: Redhat 9.0

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

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

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

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

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

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

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

おしえてちょ。

> libc5使ってるのだけどね
(´-`).。oO(…価値のある情報だろうか?)
>>61
再帰。スタックあふれに注意。
64デフォルトの名無しさん:03/06/29 08:40
>>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
65デフォルトの名無しさん:03/06/29 12:07
>>64
popenの引数はひとつなの?
違うよ、御免よ。"r"を付け足してねん。
67デフォルトの名無しさん:03/06/29 14:02
現在、無線LANでクライアントPCから数ミリsecでリアルタイムにデータ受信をしていますが、
サーバPCからキー入力をして無線LANを使ってクライアントPCに文字信号を送信したいと思っています。
どのようにしたらリアルタイムキー入力ができるのか教えてください。
ちなみにsysytem("stty raw");関数を使ったらキー入力待ち状態になりリアルタイムデータ受信が止まってしまいました。
OSはlinuxです。よろしく御願い致します。
>>67
RealtimeのOSに変えたらどうだ?
>>67
・O_NONBLOCKでopenする
・poll/selectでデータがある事を確認する
・スレッドで入力待ち

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

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

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

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

fdatasync(fd);

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

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

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

#BSD/OSはillegal instruction使ってたかも。
>>98>>99
WindowsもFreeBSDもINT呼び出しだよ。引数の扱いがLinuxと違うけど。

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

SolarisやUnixwareはコールゲート。
101デフォルトの名無しさん:03/07/04 21:02
はつみみです
>>100
ではINT 2EHでどのようにして呼び出しているのかコードを書いてください(w
お願いですからintと書かないで下さい。なんのこっちゃと思ったよ・・・。

やはり基本はINT86x()でつか?
>>104
http://www.securityfocus.com/data/library/ntkern.doc (Word形式)
これ、Word形式じゃないじゃん。

補足しておくと、Native APIというのがUNIXのシステムコールに相当するもの。
Native API(ntdll.dll)を使ったプログラムの例は
http://www.sysinternals.com/ntw2k/info/native.shtml
INT と int じゃ激しく違うと思うんだがどうか。
>>106
INTRRUPTとintegerだからなぁ
INTRRUPTってしらねーなあ。INTERRUPTなら知っているが。
109デフォルトの名無しさん:03/07/05 12:25
揚げ足鳥揚げ
腹減った
>>100
Solarisで、kernel にトラップするのは ta 命令。
Solaris for x86 は知らん。
>>98>>100
Linuxは、標準では、引数を直接レジスタに入れてINT 80Hを呼び出す形で
システムコールを実装しているけど、Linuxには実行ドメインという概念と
personalityというシステムコールがあって、プロセス単位でソフトウェア
割り込みやコールゲートの扱いを変更できる。

BSDのLinuxエミュレーション機能の方が有名だし、最近はほとんど使われて
いないけど、LinuxにはiBCSというSolarisやUnixwareなどのバイナリを実行
する機能があって、それの実現のために使われている。

iBCSのサイトや
http://www.purplet.demon.co.uk/linux/ibcs/
Linuxのソースの
linux/kernel/exec_domain.c
linux/include/linux/personality.h
あたりを見ると面白いかも。
初歩的な質問で恥ずかしいのですが、
UNIXでファイルの削除をする方法(プログラム)がわかりません。

ご教授おねがいします。
>>113
man unlink
>>114
ありがとうございます。
あまりに盲目な自分がちょっと悔しいくらいです。
>>115
ちなみに、removeならCの標準関数だからUNIXに限らず使える。
>>112

iBCS/Solaris/UnixWare(SVR4)互換機能も、実行ドメイン/personality に
相当する機構も、どちらも *BSD にだってあるだろ。
FreeBSD だと sysentvec (<sys/sysent.h>)、
NetBSD だと execsw (<sys/exec.h>) だな。

NetBSDもint 0x80なわけだが、実はFreeBSD/NetBSDが386BSDから別れた頃は、
コールゲートの方を使っていた。トラップゲートに切り替えた理由は、少な
くとも当時のマシンでは、コールゲートよりもトラップゲートの方が速かっ
たかららしい。これはFreeBSDでは1996年頃、NetBSDでは1994年頃の話。
当時からのcvsツリーが公開されているってのは便利だのう。
Pen4からはsyscallですかねぇ
最近C#をはじめたのですが、GDI+がWindowsXPでは遅いそうです。
LinuxではC#とGDI+はどのくらいの早さで動きますか?
>>119
LinuxでC#とGDI+がサポートされているのかどうかを聞きたい。
てゆーか、動いているところを見てみたい。
Lindows?
GDI+はよくしらんが、LinuxでC#はできてると思うが。
LinuxのカーネルがC#でかかれるのはいつぐらいになるだろう。
三年後ぐらい?
Linuxのカーネルがjavaでかかれるのはいつぐらいになるだろう。
で、そのVMを動かすために別なOSが必要になって…
それをC# or javaで実装して…
以下繰り返しとか。

そういえば、Linuxカーネルをjavaで実装するのはどこかで見たような記憶があるなあ。
javaはjava CHIPが普及すれば可能と思ってるんだけどね
でも、もはや利権の喰い物にしか見えないなぁ
>>126
Java chip の OS って Java じゃないよ。(あたりまえだけど。)
まさか、Java chip って Java しか動かないと思ってるのか ?
129126:03/07/11 22:42
>>128
よう知らんけど、Linuxカーネルをjavaで実装って、それ以外にどうやってやんの?
Java chipってVMそのものだと思ったんだが・・・。
>>128
>まさか、Java chip って Java しか動かないと思ってるのか ?

純粋なものだとそうだろうな。
バイトコード解釈できないCPUはJavaChipじゃないわけで。

なんか組込用VMと勘違いしてないか?
>>129
VM 書いて、その上で動くカーネルソースを書けばいいだけだと思うけど。
もちろんメモリー管理とか、割り込み処理なんかは Java じゃ書けないけどね。
Unix だって、100% C ではない。
それとおんなじで、90% (値はてきとー) Java のカーネルとかなるんだろうな。

>>130
> バイトコード解釈できないCPUはJavaChipじゃないわけで。

これは、正しいけど、バイトコード (* も *) 解釈できる CPU だよ、普通の Java chip って。
100% Pure Java chip (=バイトコードしか解釈できない CPU) と言うのも作れるだろうけど、IO とかどうするの ?
自分だけじゃでブートもできないのは、ちょっと応用範囲が限られまくりだよね。
>>131
>IO とかどうするの ?

出来ない理由が何かあったっけか?
Inferno?
>>132
もしかして...
println() ってやったら、出力できるやん。何が問題 ?
って言う理解なの ?

デバイスドライバって知ってるか ?
135126:03/07/11 23:52
>>131
なんか現状のJava chip実装に依存したこと書いてない?

メモリー管理や割り込み処理だってVMから下に実装すればいいだけで、
それをソフトウェアで実装する必要はないよね。
全部含めてJava chipとすれば、バイトコードのLinuxカーネルだって
動くと思うんだけどなあ。
>>135
> それをソフトウェアで実装する必要はないよね。

ハードで実装しろと...、まあがんばってください。

まさか、μプログラムなんてソフトっぽい方法はとらないよね。
それなら、20年前に LISP でやったことあるから。
(μプログラムレベルで CG 動くと、割り込みも受けられないんだ...、よく考えたらあたりまえだけど。)
137126:03/07/12 00:12
ハードで実装する必要はないけどね。
クルーソーみたいな実装でもいいし。
pentiumだってソフトは載ってるし。
>>137
天然なのかなぁ...。

> クルーソーみたいな実装でもいいし。

CMS の 'S' が何を意味するか知ってて言ってるのか ?
それとも、>>135 で「ソフトウェアで実装する必要はないよね。」と言ったことを忘れてるのか ?
なんか非ノイマン型CPUが流行りだしても、ノイマンの常識で物を語ろうとするんだろうなぁ・・・
UNIX系OSのカーネルって、「ここをこう直したら3%速くなりました。ヤター」
とかやってる世界なんだから、わざわざJavaで書き直して遅くするアホはい
ないと思われ…

と当たり前のことを言ってみるのはヤボですかそうですか。
>>140
別に高速化の手段としてJavaを採用しているわけではないわけで。

じゃあ、JavaとかHSPでにちゃんねるビューア作った奴はアホなわけで。
別に現在Javaが使われているような応用において、
Javaを否定してるわけじゃない。

> じゃあ、JavaとかHSPでにちゃんねるビューア作った奴はアホなわけで。

なんで? HSP とかビューアって、性能が第一に評価されるソフトウェア
じゃないでしょ?

UNIX系カーネルって、ほぼ同一の仕様で実装が異なるもの、わんさか
あり(Solaris,Linux,*BSD,...)、速度が遅いとあっさり見捨てられて
他に乗り換えられる運命にあるから、今のJavaには向かんよ。

JavaでCと全く同等の性能が出る時代になるか、カーネルの
性能なんてどうでもいい時代になったら話は別かもしれんが、
当分そういう時代は来ないだろうし、そういう遥か未来には、別の
言語が流行ってるんじゃないの?
>>142
OSの評価基準はその上で動くソフトウェアやドライバがいくらあるかだと思われ。
で、Java に書き換えたらどうなる?

利用可能なソフトウェアの数は変わらない。
カーネルの提供するインターフェース(システムコール)は
実装言語がCであろうとJavaであろうと同じだからね。

動くドライバの数は、書き換え作業の間は極端に減る。
デバイスドライバの場合、生のハードウェアにアクセス
するわけだから、Javaで書くよりも、Cで書いた方が
むしろ簡単だしな。アプリケーションと違って、Java
で書いても、バグがあればメモリ破壊とか簡単に起きる
ので、全然安全にならないし。

で、速度は、明らかに遅くなる。
そんなもの、誰が使うの?
>>144
じゃあ、JavaとかHSPでにちゃんねるビューア作った奴はアホなわけで。
C言語で既に存在するソフトウェアと、全く同じ仕様のものを、
JavaやHSPで書く奴は、アホかもしれんな。(勉強目的は除く)
遅くなるだけだから。

でも、JavaやHSPで書いたバージョンは、実は仕様が違う(使い
勝手が異なる)んじゃないのか?

UNIXカーネルの場合、仕様(システムコール・インターフェース)は
どのカーネルでもほぼ全く同じなの。POSIX.1で決まってるからな。
>>146
>(勉強目的は除く)

では、Java-Linuxは肯定されるわけだ。
勉強のためだけに100万行を越えるプログラムを書くほど
元気のある奴はおらんよ。(断言)

俺、これまで結構Javaを気に入っていたんだが、Java厨を
嫌う奴の気持ちがなんとなくわかってきてぞ。(wr
>>148
独りよがり。
>>139
はぁ ? もうちょっと具体的に言ってくれ。それとも単に話をはぐらかしたいだけなの ?

>>140
そういう側面もあるが、そういう方向は極論すればフルアセンブラでカリカリチューニングすればいい。

ってならないのは、当然移植性とかのバランスを考えてるからだよ。

どんなに速くたって、Cray-MP のみサポートと言われても困るだろ。

>>146
> C言語で既に存在するソフトウェアと、全く同じ仕様のものを、
> JavaやHSPで書く奴は、アホかもしれんな。(勉強目的は除く)
> 遅くなるだけだから。

速度はハードでカバー + どこでも動く (Sun の言うとおりなら...) → ウマー

を狙ってんでしょ。現実はなかなか厳しいものがあるけどさ。
> 速度はハードでカバー + どこでも動く (Sun の言うとおりなら...) → ウマー
> を狙ってんでしょ。

「どこでも動く」ってのは、それ自体、ソフトウェアの仕様の一部だよ。

C で書かれていて、かつ、Java が動く全てのプラットフォームで
動作する 2ch ブラウザがあるなら、それと全く同じものを Java で
書いても、単に遅いだけで、メリット・ゼロじゃん。

話を戻すと、UNIX カーネルの場合、Java で書いても、どこでも
動くなんてことにはなりえない。というのは、Java がどこでも動くの
は、Java VM が機種依存性を吸収してくれるからだが、OS のカーネル
の仕事のかなりの部分が機種依存性の吸収に割かれているわけだから、
もしカーネルモードで動く Java VM に機種依存性を吸収させるので
あれば、結局、カーネルのかなりの部分を、Java で書いたパートで
はなく、Java VM の一部として書かざるを得なくなる。すなわちカーネル
のかなりの部分は、結局 C で書く (実用 Java VM のほとんどは C で
書かれているよな?) ことになっちまうからだな。

スピードは遅い、どこでも動くわけでもない、じゃ、いったいメリット
は何なんだい?
selectでうまくゆきました。ありがとうございました。
なんか一人だけデムパがいることがわかった
まあ、プログラマだしな。
自分がバカなのを知らないんだろ。
いつものJava厨の妄想ってことで。
123と124が異なる人物だとすると、デンパは1人じゃなくて2人
かもしれん。ガクガクブルブル
>>156
お前も含めて3人だ。
JavaOSってのは、既存のframeworkにのっとったOSを、
単にJavaで書いたものではなくて、
class verifierとかappletとかservletとかJiniとか、
そういった概念で新しいOS frameworkを編み出すものなので、
そこんとこよろしく。
159デフォルトの名無しさん:03/07/13 19:25
大容量ファイルを読み込むためには
どうすればいいですか?
2G以上ぐらいだとhexdumpでもfopenでも見れないんですけど.
Cでどうすればいいですか?
160デフォルトの名無しさん:03/07/13 19:54
>>159
またここにも・・・
いまどうやっているのかな?
OSは?ファイルフォーマットは?使っている関数は?
また見れないとはどういうことなのかな?
fopenで失敗する、freadd失敗する?
そのときのerrnoは?
とにかく状況を細かく分析することが大事です。
>>159

それって、Linux カーネルを C#/Java で書き直すって話とは
直接関係ないのでは?

>>160

ここ参照。
http://ftp.sas.com/standards/large.file/x_open.20Mar96.html

簡単に言うと、cc のオプションに
`getconf LFS_CFLAGS` `getconf LFS_LDFLAGS` `getconf LFS_LIBS`
をつける必要がある。ただし、リンクする全てのモジュールの
コンパイルオプションにつけておかないと悲惨な目に会いかねない
から注意。
(single quotation じゃなくて back quotation であることにも注意。
それから、Tru64と*BSDは、オプションなしで最初から2GB以上の
ファイルをオープンできるため、このオプションは存在しない。)

あと、もしもOSがLinuxで、カーネルが2.2以前の場合、カーネルの
2.4以降に更新する他ないので、諦めるしかないこともある。
162159:03/07/13 21:58
>>160 161
どうもありがとうございます.
OSは Red Hat Linux 9.0です.

とりあえず試してみます.
163159:03/07/13 22:29
>>160
書き忘れましたが,
errnoの確認してませんが,
fopenの時点でNULLが返ってきます.


>161
gcc `getconf LFS_CFLAGS` `getconf LFS_LDFLAGS` `getconf LFS_LIBS` foo.c
みたいな感じですか?
Mac OS X (10.2.6)で試したんですけど
getconfがないみたいです.
またRed Hatで試したら報告します.
164160:03/07/14 10:37
>>159
LFS(Large File Summit)の対応は各UNIXによって違うようですね。
RedHatのサポートに聞くのが一番早いと思うのですが。
要は従来ファイル内のオフセットをlong(int)で持っていたのだが、
これだと最大オフセットが2^31=2Gで、それを超えるサイズのファイル
はアクセスできない。なんかファイルサイズの2000年問題みたいですね。
パッチとかも必要そうだし、やっぱりベンダーに聞くのが一番かな?
参考turbolinux
http://www.turbolinux.co.jp/knowledge/public/360.html
>>164
サポートを受けられるとは限らないと思うけど・・・
166 :03/07/14 13:18
>>159

fopen系の関数を全てラージファイル対応にするには、-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
あたりのオプションをつけてコンパイルすべし。ファイルオフセットは long じゃたりなくなるので、
fpos_t ね。

既存のコードとのコンパチビリティ等が気になるなら、必要な部分だけ fopen64 とか fread64 とか
使っても良い。
>>166
sageてください
168デフォルトの名無しさん:03/07/14 17:31
64bit値をprintfしたいんですけど、どうすれば?
man printf
>>163
MacOS XのUNIX部分は、*BSD系だと聞いているから(使ったことないけど)
何もオプションをつけなくても、2GB以上のファイルが使えるんじゃない
かな。

>>163,164
RedHat 9.0 なら、161 の方法で大丈夫な筈。

>>166
それよりは、161の方が移植性が高いんじゃないかな?
あと、細かいことを言うと、明示的に -D_LARGEFILE_SOURCE を指定する
必要があるのは、fseeko() と ftello() が使いたい場合ぐらいで、もし
この2つの関数が不要ならば -D_LARGEFILE_SOURCE は要らない筈。
(もっとも Solaris で `getconf LFS_CFLAGS` すると、デフォールトで
-D_LARGEFILE_SOURCE も有効になるけど。でも、こうならないプラット
フォームもある。)

で、もし -D_LARGEFILE_SOURCE と -D_FILE_OFFSET_BITS=64 の両方が
有効なプラットフォームなら、この2つを定義した段階で、off_t が
64ビットになるので、fpos_t を使わずに、fseeko() と ftello() に
off_t を渡すという手もある。

> 既存のコードとのコンパチビリティ等が気になるなら、必要な部分だけ
> fopen64 とか fread64 とか使っても良い。

このAPIを使いたい場合、cc のオプションに
-D_LARGEFILE64_SOURCE `getconf LFS64_CFLAGS` `getconf LFS64_LDFLAGS` `getconf LFS64_LIBS`
をつけないと、移植性がなくなると思う。
あと、この場合オープンなど全ての関数をfopen64()のように書き換えないと
まずいので注意。それに、標準入力が2GBを越えた場合の動作保証とかもない
んじゃないかな。
>>170
Mac OS X 10.2.6は、

/usr/include/sys/types.h:typedef int64_t quad_t;
/usr/include/sys/types.h:typedef quad_t off_t; /* file offset */

で、/usr/include/stdio.hで、

#if !defined(_ANSI_SOURCE) && !defined(__STRICT_ANSI__)
typedef off_t fpos_t;
#else
typedef struct __sfpos {
char _pos[8];
} fpos_t;
#endif

よ。
>、*BSD系だと聞いている
例えばNetBSDとFreeBSDは全くの別物ですが。
173山崎 渉:03/07/15 09:44

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
174159:03/07/15 22:21
みなさま激しい討論どうもです.

163で書いたように
gcc `getconf LFS_CFLAGS` `getconf LFS_LDFLAGS` `getconf LFS_LIBS` foo.c
でコンパイルしてみました.
最初の6バイトぐらいは読むことができましたが
それ以降はセクメントエラーになりまして,
なおかつ値が違っています.

使用した関数はfopenとfreadとfseekです.
-D_LARGEFILE_SOURCE と -D_FILE_OFFSET_BITS=64
をコンパイルオプションにしてfopen64, fread64の使用を試みましたが,
fread64が見つからず,
fopen64とfreadの組み合わせでも同じくセグメントエラーになりました.
ちなみにOSはRed Hat 9.0で試しました.
> 例えばNetBSDとFreeBSDは全くの別物ですが。

おいおい。

NetBSDとFreeBSDが別れてからは、当然違いも出てきているが、
4.4-lite時代から引き継いでいる部分は同じだろ。それに別れて
からも、相互にimportしあっているため、同じ部分も多いだろ。
最近だと、rc.dとかrescueとかはNetBSDからFreeBSDへのimport
だし、逆にkqueueはFreeBSDからNetBSDへのimportだしな。

今回話題のoff_tが64bitである件については、4.4-liteからの
流れだから、NetBSD、FreeBSD、OpenBSD全てで同じ。また
171を見る限り、MacOS Xも、同じ流れを組んでいて、最初から
off_tが64bit。

つまり、この話題に関しては、NetBSDとFreeBSDはほぼ全く同じ
と考えれば良い筈だ。
>>174
おかしいなあ。
RedHat-8.0 だが、下記のプログラムを
gcc `getconf LFS_CFLAGS` `getconf LFS_LDFLAGS` `getconf LFS_LIBS` -o hoge hoge.c
でコンパイルして、2GBを越えるファイルに対して
  ./hoge ファイル名 | cmp - ファイル名
したが、ちゃんと動いているぞ。
ちなみに、オプションなしでコンパイルすると
  ファイル名: File too large
になる。
Redhat-8.0→9.0で、バグが入ったとも思えんのだが。

#include <stdio.h>

main(int argc, char **argv)
{
 int i, c;
 FILE *fp;

 for (i = 1; i < argc; i++) {
  fp = fopen(argv[i], "r");
  if (fp == NULL) {
   perror(argv[i]);
   return 1;
  }
  while ((c = getc(fp)) != EOF)
   putchar(c);
 }
 return 0;
}
>>174
まず1kBくらいのファイルで試してデバッグしろ。
178159:03/07/16 09:08
>176, 177
176とほとんど同じプログラムですよ。
179159:03/07/16 09:22
#include <stdio.h>
#include <stdlib.h>

int
main (int argc, char *argv[]) {
unsigned short s;
if (argc > 1) {
filename = argv[1];
if ((fp = fopen (filename, "rb"))==NULL) {
fprintf (stderr, "Can't open %s.\n", filename);
exit (1);
}

fread (&s, sizeof (unsigned short), 1, fp);
fprintf (stdout, "s = %d\n", s);
}
return (0);
}

バイナリなのでこんな感じです.
バイナリってなんだ、、、
>>179
> fprintf (stdout,

printfをしらんのか?
>>180
主にCR+LF→LF変換抑止のための、"rb"の'b'ですよ。
>>179
細かいツッコミはともかく、filenameとfpが未定義だし、
それを定義してもIA32なら2byteしか読まんあたり、
そのまんまのコードとは思えん。
>>182
真性かよ
glibcはbついてても無視するだけだから、この際関係ないはず。
>>182
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fopen.3.html
知っててやってるならいいがな。
187159:03/07/16 13:01
>>183
確かに未定義でしたね。

hexdump -v -C ファイル名 | less
だと、
25 cc 00 ・・・。
とあったので 2バイトしか読んでないです。
本当はもっとfread以降も書いてますよ。

そして値は10進数に変換すると、
9676になるはずですが、
上のプログラムでは値が異なってました。
glibc の fopen テキストモードは
`\r\n' を `\n' に変換しましたっけ…?
もうネタはいいよ。勘弁してくれ
>>159
OSを疑う前に、まず

unsigned short s;

unsigned char s[2];
に変更し、

fread (&s, sizeof (unsigned short), 1, fp);
fprintf (stdout, "s = %d\n", s);

fread (s, sizeof(s), 1, fp);
printf("s[] = 0x%02x:0x%02x\n", s[0], s[1]);
に変更して、試してみるように。

> 値は10進数に変換すると、
> 9676になるはずですが、
> 上のプログラムでは値が異なってました。

どうせ52261って表示されたんだろ? それで合ってるんだよ。
「big endian」と「little endian」でぐぐれ。

まず自分のミスを疑えっていうのは、プログラミングを
勉強する上での基本だ。
191159:03/07/16 20:47
>>190

そのとおりです m(_ _)m
ぐぐって解決します。
ぐぐるよりまず、まともに動くプログラムでテストしろ。
てっきり以前に(同じ環境で)short変数の中身をfwriteしたものを読んでいるんだと思っていた・・・

それにしても190がひっそりとprintfに直しているところにワラタ
194159:03/07/17 00:06
>>192
Macでは動いてたんで安易に考えすぎましたわ
195デフォルトの名無しさん:03/07/17 01:38
>>194
問題を理解できてるの? かなり不安な一行レスなんだけども…

MacでつくったデータをMacでよむのはOK,
Linux for x86でつくったデータをLinux for x86でよむのはOK.
全然over 2Gbyteの問題じゃない。Byte orderの問題。
>>195
いつからバイトオーダの違うファイルが読めなくなったんだ?
読めないんじゃなくて、正しく読めないと勘違いしたんだろ。159が
いつまでも入門者をいじめるなよ・・・
↓次の質問どぞー
188が、ネタなのか、それともUNIXでテキストモードとバイナリモードの
区別があると思っているのか、どちらなのか教えてください。おながい
します。
とりあえず200
201デフォルトの名無しさん:03/07/18 00:56
linuxのgccでs-sjisのコードをビルドすることはできますか?
普通にやるとエスケープコードがどーたらこーたらという警告が出ます。
コードは普通ASCIIで書くもんだ。
>>202
文字列定数はコードの一部じゃないの?
>>201
文字定数、文字列定数、コメントだけでいいですか?

./configure --enable-c-mbcharでcompileして、(gcc -vで確認可能)
環境変数LANGをC-SJISかな?
205201:03/07/18 01:40
>>204
>文字定数、文字列定数、コメントだけでいいですか?
これでいいですが、キーワードを検索したところ

ビルドオプション --enable-c-mbchar の仕様の問題
一部方面で「configureに --enable-c-mbchar を指定してmakeしなおしたgccを用い,
環境変数 LANG=C-SJIS を指定すると,gccをSJIS対応にできる」という情報がありますが,
これは限りなく誤報に近いです。
http://homepage1.nifty.com/kuuku/gcc-sjis/

とありますがどうしたものでしょう。警告箇所に\を入れて回るのが無難ですかね。
206デフォルトの名無しさん:03/07/18 01:53
プログラムの設定ファイルって、どこに置けば言いの?
できればプログラムをインストールした同じ所におきたいんですが。

あと、
fopen("~/hoge" "r");
とかしても開けないみたいです。こういう場合はどうするんですか?
(自分のホームの絶対パスが必要なのかな?)
207_:03/07/18 01:53
>>206
~/hogeの~をなにが展開するか考えればできない理由がわかるはず。
ホームディレクトリならgetenv("HOME")で得られるんじゃないかな?
>>205
どうでもいいけど差分を置いて欲しいよ。
>>205
> http://homepage1.nifty.com/kuuku/gcc-sjis/
かなりad hocな改造だからこのまま取り込まれることはあり得ないだろうが、
対応は必要だろうな。

ただ、--enable-c-mbcharがあまり使われてないのは、文化がどうこうよりも
gettextizeの方が主流になって来てるからじゃないかと思う。
めんどくさいから漏れはSJIS文字を\xxx\xxxと展開するフィルタを
かますだけにしてる。
includeとかは知らん。
212_:03/07/18 03:04
>>206
> できればプログラムをインストールした同じ所におきたいんですが。
プログラムのある場所が自由に書けるなんてものすごい設定が標準の
Windowsににかぶれすぎ
>>213
はいはい。日本語が話せないやつは帰った帰った。
>>210
「どう考えても馬鹿げてる」のはソースに直接日本語文字列を
埋め込むことのほうだよな。
で、GNU信者が感情的だとか日本は三流の国だとかに至っては
ほとんどデンパだ
>>214
日本語読めない奴は帰れ
217正しい日本語晒しあげw:03/07/18 08:11
プログラムのある場所が自由に書けるなんてものすごい設定が標準の
Windowsににかぶれすぎ
プログラムのある場所が自由に書けるなんてものすごい設定が標準の
Windowsににかぶれすぎ
プログラムのある場所が自由に書けるなんてものすごい設定が標準の
Windowsににかぶれすぎ
プログラムのある場所が自由に書けるなんてものすごい設定が標準の
Windowsににかぶれすぎ
プログラムのある場所が自由に書けるなんてものすごい設定が標準の
Windowsににかぶれすぎ
プログラムのある場所が自由に書けるなんてものすごい設定が標準の
Windowsににかぶれすぎ
後々面倒だからEUCでやっちゃったほうがいい
Windowsの場合も、

>>206
> プログラムの設定ファイルって、どこに置けば言いの?
> できればプログラムをインストールした同じ所におきたいんですが。

としてしまうと、multi user対応guildelineに適合しなくなってしまうわけだが…
220デフォルトの名無しさん:03/07/18 09:24
>>219
guildelineって何?
ギルドの線。
設定ファイルを配置するディレクトリの
定番はやはり$HOMEですかね
~/Application Data/<APPNAME>/
が基本だろ。
レジストリに入れるのはどうだろう?
~/.gnome/apps/ か?
>>219
Microsoftの方針はともかく、実運用レベルではいまだに
プライベートini派が勢力を保ってるんで。
http://pc2.2ch.net/test/read.cgi/software/1048216458/l50
「2ちゃんのとあるスレでは」でしょ。
Mac OS Xは、~/Library/Preferences/の下に、
例えばnet.2ch.tech.plistってXML plist fileだな。
>>227
スレは例としてあげただけでレジストリ嫌い発言はいたるところで見かけるが
確かに母集団は偏ってるかもな
Linuxにレジストリを導入しようという声が強いから、じきにSolarisとかでも
レジストリが使えるようになるよ、きっと。
>Linuxにレジストリを導入しようという声が強いから、

初めて聞いた。
>>230
ハハ
ほんとになりそうで怖い。
かんべんしてくれ
それじゃあ、UNIXでも移動プロファイル導入ですね。
>>230
AIXを使え。
ODMっていうレジストリっぽいのがあるぞ。
真の革新は常にWindowsに有り。
Unix/Linuxは常に後追いだな。
>>235
$HOMEをNFSマウントすりゃ、似たようなもんだろ。
>>237
標準入出力はUNIXの方が先ですが。
>>238
やっぱり設定ファイルだけログオン/ログオフ時にコピーしないと…
同じ不具合が楽しめません。
Windowsがいつも最初と思ってるとは
おめでたいにもほどがありますな
標準入出力が革新だと思ってるとは
おめでたいにもほどがありますな
243デフォルトの名無しさん:03/07/22 13:52
Linux + gccなんですが、
コマンドラインでargv[1]に"*"を渡すと、なぜか"2m"という文字列が入ります。
どうしてですか?
そのディレクトリに2mという名前のファイルがあるから
>>243
> argv[1]に"*"を渡すと、

渡していない。
246243:03/07/22 13:58
>>244,245
すんません、ワイルドカードを忘れていたとは...恥ずかしい
./command '*'
248COBOLer:03/07/22 21:17
>>242
えっ何を言ってるんですか
革新的に決まってるじゃないですか
*って誰が展開するの?スタートアップルーチン?
シェル
>>249-250

ワラタ
どこが面白いんだ?
たぶん>>251の顔。
デーモン型のようなサーバプログラムは、どうやって作るのが一般的なのでしょうか?

ぱっと思いついたのは、
起動後system関数を用いて常駐専用のプロセスを起動、
以後はパイプ経由でその常駐プログラムを操作・・といった形式なのですが、
ぶっちゃけ、これで良いのでしょうか?




regexを使っているのですが、"^"を使っても文字列の先頭にはマッチしますが、
行頭にはマッチしてくれません。行頭にマッチさせる方法はないものでしょうか?
REG_NEWLINE
257255:03/07/25 11:13
非常に申し上げにくいのですが、間違ってregexecにREG_NEWLINEと書いていました。
regcompの方にちゃんと書いたら当たり前のように動きました。
どうもありがとうございました。
>>254
daemon自身がfork()し、親はすぐ終了。子は養子縁組に出されて動き続ける。
controling terminalをdetachする。
/tmp,/dev,/var/run辺りにあるnamed pipeを使う。(e.g. lpd, syslog)
が古典的。
>>254
自分で fork() などせずに daemontools にまかせるのが djb 信者的
daemon()呼ぶ
daemonを殺す関数、amon()。
262デフォルトの名無しさん:03/07/25 12:55
常駐型のサーバプロセスってデーモンにした方がいいんですか?
デーモンにすると何が嬉しいんですか?
amen()じゃなかったっけ。
端末にぶらさがってたら不便だろう。
265254:03/07/25 14:45
>>258-262

さんきゅー、とりあえずキーワードを元に色々調べて見ます。

>>261,263
abon()
>>264
ふつー inetd 経由で起動させるか、スタンドアロンにするかの選択だろう。
>>267
スタンドアロンにした時に、
コントローリング・ターミナル持ったままだとうざいことを>>264は言ってんでしょ?
シェルのジョブ・コントロールか何かと勘違いしてませんか?
/bin/daemonize はどうよ?
270名無しさん@Emacs:03/07/29 17:29
XIMがらみのプログラムをC++でいつかは創りたいなぁと思ってるのですが、
GUIのライブラリはどれが便利なんでしょうか?

gtk, qtはなんか使いたくないので、
そうするとMotif, Xtあたりしか残ってないですかねぇ?
お、釣りだ。
>>270
Fox wx
274デフォルトの名無しさん:03/07/30 01:36
275山崎 渉:03/08/02 02:12
(^^)
前スレがなくなっとる・・・
999999999番以下のスレッドは倉庫行き処理のバグで行方不明になります
読めるぞ。
と思ったらnavi2chのキャッシュか。
>>278
アップきぼーん
>>279
俺もあるがどこへしたらいい?
ウプロダとか言うところにウプすればいいのか?
>>280
それでよろしく頼みます。
http://link.ziyu.net/html/uplink.html
282デフォルトの名無しさん:03/08/09 20:17
PCゲームってのはコア層がやるもんだよ。
過去の現象見ても、事務機としての普及が第一だろうね。

はっきり言ってLinux/UNIXは汎用的な事務機としてはロクなもんじゃない。
基本的に計算機の玄人が使うようにできてるからな。
事務屋にゃ扱える代物じゃねーんだよ。

ただ、つけいる隙はあると思うね。
Linux/UNIXはUIの取り換えがきくから、専用機として作り込むのにはWindows
なんかより断然いいだろう。
そこらへんのじじばばが何気に街角で触ってる機械が実は誰も知らないけど
Linuxでしたなんて現象はこれからどんどん増えるだろうね。
事務機としてもマルチウィンドウが必要なところってのは実はあんまり無い。
その証拠にほとんどのWindowsユーザはアプリケーションを最大化して使って
るじゃない。
Xなんか使わなくてもDOS時代のUIを思い出せば充分使えるものになるだろうね。
むしろその方が混乱が無いだろう。アクティブウィンドウが切り替わっただけ
で「パソコン壊れたー!」ってパニック起こす連中を嫌と言うほど見て来た。

パソコンとしてもそれに適したUIが出て来れば使う人はいるだろうね。
そのへん頑張ってるのがKDEやGnomeだが、こっちはさほど利点が無いから難し
いな。
NECや富士通が気合い入れて自社UIを作って出しゃいいんだがな。KDEやGnome
ベースでもいいからさ。


>282
>Linux/UNIXはUIの取り換えがきくから、専用機として作り込むのにはWindows
作ってから言え

>Linuxでしたなんて現象はこれからどんどん増えるだろうね。
作ってから言え



>282
作ってから言え
>>283
コピペにマジレスですか?
>284
どこのコピペだよ
>>285
Linux板
UNIX板にもコピペされている
>286
コピペにレスしたって別にいいじゃねーか
いちいち反応すんなボケ
>>287
ごめんね
コピペにマジレスと指摘されて「どこの」と絡むも、
あっさり反論されたので開き直った287に萌え
ある意味、男らしい。
>NECや富士通が気合い入れて自社UIを作って出しゃいいんだがな。KDEやGnome
>ベースでもいいからさ。
悪夢。
童夢君。
293デフォルトの名無しさん:03/08/11 01:46
たまにはあげるか。
294278:03/08/11 01:55
>>280
アップした?
295デフォルトの名無しさん:03/08/11 04:47
>>291
誰も使わないです。
296デフォルトの名無しさん:03/08/11 05:03
★★★★★★★★★★★★★★★★★★★★
★  激安アダルトDVDショップ   ★
★  お買い得セール1枚500円〜!急げ!★
★★★★★★★★★★★★★★★★★★★★
        激安でDVDをGET!
      http://www.get-dvd.com
   何と! 1枚 500円〜 セール中!

   インターネット初!「きたぐに割引」
  北海道・東北の皆様は送料も激安!!
      http://www.get-dvd.com
       ゲットDVDドットコム!
   
    今すぐアクセス  Let's go !!!!!!!
297_:03/08/11 05:32
298_:03/08/11 06:15
>>276
●板で捜索願いを出したらhtml化してもらえました。
http://pc2.2ch.net/tech/kako/992/992057422.html
>>299
激しく感謝します。

そのフォーマット(?)にしたがってURLをつくれば行方不明のスレッドも見つけられるのか。
html化されてなきゃ無駄。
302山崎 渉:03/08/15 15:46
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
303デフォルトの名無しさん:03/08/24 09:38
age
hogeさんが、"/home/hoge/sock_afuinx"のパス名で
AF_UNIXソケットで通信するサーバを作った時に、

hoge以外のローカルなユーザーmogeが内部ソケットの通信内容を傍受する事は可能でしょうか?
また、mogeが"/home/hoge/sock_afuinx"を用いたクライアントを使って、
こちらのサーバとやりとりされる事ってあるのでしょうか?

なんか日本語になってなくてすいません。
日本語になってない以前に、UNIXソケットについてちっとは
調べた方がよいと思われ。
>>304
rootならできる。
307デフォルトの名無しさん:03/08/30 22:47
C言語なら俺に聞け!スレから誘導されました。

exec系関数というのを詳しく教えてください。
いくつか種類があるのは分かったんですが、どういう違いがあって
どう使うのか分かりません。
man execve
man execv
309デフォルトの名無しさん:03/08/31 03:24
execve(2) 最後はこれが下請
execvp(3) PATH検索版
execle(3) 可変引数版
あたりに限定して調べてみては?
根本的にコマンドライン引数とかpathとか環境変数が解っていないという可能性は?
とりあえず、execlp(3)から試してみれば、分かるようになるだろ。
forkから教えてやらんといらん誤解を招きそうだ。
313307:03/08/31 12:31
forkは知ってます。exec系のどれを使うべきなのか
何を根拠に選べばいいのか、と
それぞれの場合で、引数に何を書いていけばいいのかが分からないんです。
例えば、「cd」を実行させようとするならば、どのように書けばよろしいのですか?
>>313
chdir()
どうしても exec 使って cd を実行したいなら
execl("/bin/sh", "sh", "-c", "cd", 0);
かなあ。なんの意味もないけど。
>>313
shellの内部関数は、>>314のように自分でやれ。
shellに実行させてもshell内だけでしか有効ではない。
317デフォルトの名無しさん:03/08/31 12:50
内部関数→内部コマンド
318307:03/08/31 12:55
>>315
ありがとうございます。
execl("ディレクトリ","コマンド",・・・,ヌルポインタ);
ということですか?
パス検索版というほうの場合はどう書けばいいのでしょう?
man読めよ・・・マジで。
>>318 ガッ
321デフォルトの名無しさん:03/08/31 13:08
system使っちゃえよ。
パス検索版は、例えば"ls"をコマンドとしたときに
環境変数PATHを参照して/binや/usr/binなどを検索してくれる。
逆に、非検索版は正しい相対パスか絶対パスを指定する必要がある。
例えば、"/bin/ls"など。

まぁ、プロセス間の連携を考えない用途では大抵は
system()かpopen()で事が足りるのでfork()/exec()しないわけだが。
323307:03/08/31 13:09
>>319
そうですね、分かりました。ありがとうございました。
>>322
ラッピングされてるだけだけどね。
>>321
system は shell のメタ文字の処理が面倒くさいからなあ。
326デフォルトの名無しさん:03/09/01 19:26
Solarisのpthreadを今激しく疑っているのですが、
スレッド関数の内で、fprintfを呼び出すのはやめた方が良いのでしょうか?
1年間普通に動いていたプログラムが、fprintfでcoreを吐いてしまいました。
どなたかpthreadを熟知している方、ご指導よろしくお願いします。
327デフォルトの名無しさん:03/09/01 19:31
○  ヘコヘコ     ★ 無修正裏DVD ★      ○  ドピュ
( ヽ  ○   注文後2日でお手元へお届けします ( ヽ.。   ○
)))」 ̄[     http://www.d-para.com       )))」 ̄[
Solarisのバージョンも分からずに答えられる香具師は神。

おそらくこっちの方が詳しいのが多いと思われ。
pthread地獄
http://pc.2ch.net/test/read.cgi/unix/1010933537/
>>326
> スレッド関数の内で、fprintfを呼び出すのはやめた方が良いのでしょうか?

マニュアル読んでMT-Safeかどうか調べなよ。Solaris 9はそう。

> Solarisのpthreadを今激しく疑っているのですが、

その前にマニュアルは読めるのか?
FILE構造体のポインタをどこかで上書きしてしまっているにも関わらず
fprintfに与えているか、FILE構造体がNULLだとか。

該当する関数をスレッドとして起動せずに、単純に関数として起動して
みては?
sigsegvをトラップしてみるのもアレかと。
>>330
>FILE構造体がNULL

重箱をつつくようだけどな。変にかっこつけてファイルポインタと言う単語を使わなかったのが敗因か。
構造体がNULLなんてありえないよな。構造体へのポインタがNULLだよな。
333デフォルトの名無しさん:03/09/05 17:36
FORTRANのプログラムでRAND()を使って1から10までの
乱数を発生させるのってどうやるんですか?かなり初心者
なもので誰か教えていただけませんか?
>>333
>かなり初心者なもので誰か教えていただけませんか?
教えていただけません。
g77のinfoからコピペ。あとは自助努力するよし。

Rand Intrinsic
..............

Rand(FLAG)

Rand: `REAL(KIND=1)' function.

FLAG: `INTEGER'; OPTIONAL; scalar; INTENT(IN).

Intrinsic groups: `unix'.

Description:

Returns a uniform quasi-random number between 0 and 1. If FLAG is
0, the next number in sequence is returned; if FLAG is 1, the generator
is restarted by calling `srand(0)'; if FLAG has any other value, it is
used as a new seed with `srand'.

*Note SRand Intrinsic::.

_Note:_ As typically implemented (by the routine of the same name in
the C library), this random number generator is a very poor one, though
the BSD and GNU libraries provide a much better implementation than the
`traditional' one. On a different system you almost certainly want to
use something better.
336デフォルトの名無しさん:03/09/11 23:50
age
gccでc++の話なんですが、EUCで書かれたソースにおいて、
文字列部分をSJISエンコードでビルドすることは可能ですか?
SJIS処理系のプリンタに、ハードコーディングした文字列をそのまま渡せないかな、と
考えているのですが。
#pragmaかなにかで何とかならないものでしょうか。
お前さんがそういうpragma処理をgccに組み込みゃ、できるかもな。
普通はもうちっとましなことを考えるもんだが、お前さんはユニークだな。
>>337
変換関数一個用意するだけだべ。
別ファイルにでも#defineしておいて
それをSJISで保存しておいてincludeして使えば
341337:03/10/04 12:50
レスありがとございます。
自分で書くコードは問題ないんですが、
プロジェクトにSJISもEUCも半角カナもOS依存文字も気にしない人がいるんで、
これで動くんだからいーじゃん、てな感じなんです。
で、ソースファイルはそのままに、なんとか対応できないか考えてるわけで。
気苦労してるわけなのです。
> プロジェクトにSJISもEUCも半角カナもOS依存文字も気にしない人がいるんで、
> これで動くんだからいーじゃん、てな感じなんです。
> で、ソースファイルはそのままに、なんとか対応できないか考えてるわけで。
馬鹿には馬鹿と言ってくれ。
343337:03/10/04 14:04
>>342
…上司なんで。
愚痴っても始まらないので、何とかなんないもんかと。
話が変な流れにならないうちに、この辺で失礼します。
>>343
イリーガルな文字が含まれているとソースの管理ができないとでも言えないのかな?
345デフォルトの名無しさん:03/10/04 14:17
Linuxでtmpfileを使って一時ファイルを作っても、P_tmpdir以下にそれらしいファイルが見つからないのはオープンしたままunlinkしたからですか?
unix系では、unlinkしたらディレクトエントリは削除される。
ただし、openしたままのプロセスからは、相変わらず普通にアクセスできる。
なお、そのプロセスがcloseしたら、実体もなくなる(ように見える)。

つまり、createしておいてすぐにunlinkすると、見られずにディスクを使える。
#つーか、覗かれたくない一時ファイルでこの手を使ったことある。
>>346
なかなか面白い手法だね、それ
一時ファイルを確実に残さない方法として有効そう。
>>346,347
定跡だよもん。

>>347
激しくガイシュツなんだが…。
350347:03/10/04 18:40
>>348,349
UNIXがそういう挙動するのは知ってるが、それを
積極的に使ってる例は知らなかった。
SolarisとかLinuxとかで標準で入ってるプログラムでも
そういうことしてる?

面白いとは思うが、ディスク容量が見た目と一致しなかったり
unmountできなくなったりするので、素人には勧められない

> なかなか面白い手法だね、それ
と言っておいて
> UNIXがそういう挙動するのは知ってるが
ってのはアホ?
>>350
単に自分が不勉強なだけのくせに、何気取ってんだよ。
>面白いとは思うが、ディスク容量が見た目と一致しなかったり
>unmountできなくなったりするので、素人には勧められない

至極普通のふるまいですが? 素人にも勧めますが?
一生DOSでも使っててください。


fd=creat("foo",0644);
lseek(fd,1024*1024*1024,0);
write(fd,"bar",3);

が1G容量食うと思ってる人種なんだろうな。
354んなわけない:03/10/05 07:16
>unmountできなくなったりするので、

File system treeから辿れると、openしててもumount出来るんだろうか…
355ヽ(´ー`)ノ:03/10/06 10:29
他のプロセスからは開けないけど、使ってる事は確かなんだから、
umount できないのは当り前だと思うのだが。
APUEをちゃんと読みましょう。
実はNT4でも同じことができる。
なぜか2000からできなくなったけどリネームはまだできる
>>357
ヘェーとでも言ってほしいの?
>>357 = 0ヘェ〜
360デフォルトの名無しさん:03/10/14 00:50
高精度のタイマーを使いたいのですが、
nanosleepとusleepのどちらを使ったらいいでしょうか。
マニュアルによると、nanosleepはPOSIX.4準拠、usleepは4.3BSD準拠となっています。
性能的にはマイクロ秒の精度でいいので、どちらでもかまいませんが、互換性が高いのはどちらですか?
>>360
nanosleep
一般には
POSIX>>>>>>>>>4.3BSDなんですか?
その不等号で何を意味したいのかがわからんが、たぶん数的には

 nanosleepしかもってないOS > 両方実装してあるOS > usleepしかもってないOS

ではなかろうか。
364デフォルトの名無しさん:03/10/16 05:14
じゃあgettimeofdayとclock_gettimeではどちらの方が汎用性が高い?
nanosleepはLinuxだと精度が悪いな。最高で10ミリ秒程度の精度しかない。
10ミリ秒以下の時間眠るようにに指定しても、かならず10ミリ秒眠ってしまう。
>>365
Alphaなら1msで戻ってくるんじゃないかと。
2.6もそうなるかな。
nanosleep(2)のバグのところに書いてあるね。
>>365
スケジューラが10ms刻みだからな。
カーネルコンフィグしなおせばたぶんそれ以上の精度も可能。
>>368
10msってのは386のハードの制約じゃないの?
制約があるとしても386とは関係なく
使っているハードウェアタイマーによるもの
昔は、それ位にしておかないとタイマ割り込みの処理に時間食いすぎて、
アプリケーションが使える時間が短くなってしまったのですよ。
タイマ自体はもっと短い周期で動かせます。
BSDだとoptions HZ=500 で分解能2msになる。
犬は知らん。
犬はinclude/asm-${ARCH}/param.hの
#define HZ ほげ
同じく500で分解能2ms。
374デフォルトの名無しさん:03/10/18 18:27
自分が現在いるディレクトリを表示するにはどうすればいいんですか?
環境変数を見る。
getcwd(3)
>>375
プ

>>376
ありがとうございました。それでできました。
378デフォルトの名無しさん:03/10/19 13:47
目的にあった関数の探す方法は/usr/share/man/man[23]/*をしらみ潰しに
調べればいいのはわかりましたが、それがどのsoファイルに含まれているのかは、
どうやって調べますか? 一般的な手順があれば教えてください。
>>378
そういう順番になってしまうこと自体、既に筋が悪いと思われ。

それはそれとして、*.soの中のシンボルを知りたいならnmを使え。
380デフォルトの名無しさん:03/10/19 14:12
>>379
では筋のいいひとはどうするんですか?

>それはそれとして、*.soの中のシンボルを知りたいならnmを使え。
ということは必要な関数が分ってもどのファイルをリンクしたらよいか
分らないときは、/lib,/usr/libを全てnmで調べてるんですか?
>>378
必要なライブラリって、普通man pageに書いてない?
>>381
LinuxのGNU関連のには載ってなかったりします。
./configureのプリフィックスでライブラリファイル名も
任意に代えられるから載せられないってのもあるのかも
しれませんが。
>>381
今久しぶりにPC-BSDを起動してみたら、これには
LIBRARYというセクションがちゃんと入ってました。
>>380
google
>>384
インターネットに接続できないときはどうするんですか?
周りの人に聞く。
>>380
筋のいいひとは目的にあった関数を探す方法として/usr/share/man/man[23]/*を
しらみ潰しにしたりしない。
体系的な知識を当たれば当然必要なライブラリはその過程でわかっている。
manをしらみ潰しする程度の人にはnmで全てのライブラリのシンボルを調べるの
が相当だろう。

QDBM ってどう?

http://qdbm.sourceforge.net/
>>380
ライブラリのシンボル調べるよりソースコードを調べる方がいい
>>378
-lなんとか、を知るだけでは不満で、(通常manualに記述)
soの絶対パスが知りたいわけですか?
-lなんとか、分かればlocate, gcc -v, その他でなんとかなるでしょ。

Darwinだと、Framework(libraryのrich版)を組み合わせてFrameworkを作れるから、
この辺の調査がもう一手間いることになる。
391デフォルトの名無しさん:03/11/01 15:29
>>380
for name in /usr/lib/lib*.so; do nm $name | grep $symbol >/dev/null 2>&1 && echo $name;done

全部調べるのだってこの程度だ。
筋の良くない >>380 は,この種のことにも疎いのだろう。
最近、直リンクしただけで規制されるようになったらしいんですけ
ど、http://という書き込みを自動的にttp://に直すように出来ま
せんか? 例えば以下のように。

http://www.example.com/
  ↓
ttp://www.example.com/


【広告】新機能 Rock54【自動排除】
ttp://qb3.2ch.net/test/read.cgi/operate/1066291585/l50
UNIXプログラミング質問すれ Part2

1 :デフォルトの名無しさん :03/06/09 07:21
UNIXおよびUNIX clone環境一般のプログラミングに関する質問スレッド
linux板で聞いたらこちらへ振られてしまいました。
すぐにはレスできませんが、宜しくお願いします。

UNIXドメインソケットで開いたファイルは、カーネル側にソケットとか
の構造体が作られて、socket()を呼び出したプロセスには記述子が帰る
わけですね。もちろんプロセス側はread()とかでこの記述子を使うわけです。

ならば、あるプロセスが何かの理由で正常に終了しなかった場合、この
構造体はカーネルに残ったままになるのでしょうか?

カーネルに残ったままなら、別途記述子の番号を保存しておいて、後ほど
別のソフトを立ち上げてread()とかにその記述子の番号を使うことが
できるのでしょうか。もちろん、通信のもう一方の口はopen()されたまま
だとします。
>>395
通常はそのプロセスが異常終了したら、それらが使用していた
リソースはすべてOSが回収します。つまりclose()されるので利用できません。
>>395
カーネル内のそういった構造体は、基本的には使われなくなったら開放される。
参照しているプロセスが全て終了すると、開放されると考えればよい。

あと、プロセスが正常に終了しなかった、と書いてあるけど、終了したんなら
カーネルから見ると別に違いはない。

あと、UNIXドメインのソケットだと、ファイルにbindしていると思うけど
そのファイルはプロセスが終了しても残る。念のため。
>>395
linuxの場合, /proc/$PID/fd 覗きゃ直感で理解できるだろ。
>>395
ファイル記述子は、そのプロセス内だけで有効です。
>>398の/procを特別な例外として。
いや,だから,プロセスにbindされたモンと理解できるだろ
って意味だったのに…

同じdescriptorでも中身ちゃうし。
>>400
でも/procって外から読み書きできちゃうし…
直感的には理解できないでしょ。これは特別だと思わないと。
そんな特別だってことは,man proc すれば
403395:03/11/04 16:53
>>396-402 皆様レスサンクスです。
要はプロセスに対して記述子が与えられる、プロセスが死ねば回収されると。
stdoutとかstderrとかの記述子を見ると、1とか2とかいう値になってて、
OS全体で共通なのかと勘違いしていました。

複数の異なる、あるいは同一のプロセスから任意のログファイルに書き出すような
ロガーを作りたいと思ってます。何かの手違いであっても、ロガーが勝手に死ぬ、
死んだままというのは良くないことであり、何らかの形で接続を復旧しなければ
なりませんね。それをどうするかということで悩んでいました。

(apacheのロガーみたいに独立したものにしたい、そして汎用性があれば尚良い)
>>403
syslog を改良したい、というようなことですか?
405デフォルトの名無しさん:03/11/04 20:45
readdirって今いるディレクトリの情報しか得られないんですか?
opendirに"../"を与えて読んで行こうとするとディレクトリの
オープンはできてもファイルを辿って行けないで終わってしまうんですが。

"./"を与えた場合は全て見ることができたんですけど。
>>405
どうせ Permission denied だろ
>>406
プログラムを動かしたディレクトリにあるファイルと
同じファイル名のファイルだけ表示されたんですけど。
終わったときにperrorではfile not foundみたいなのが表示されてました。

例えば/aaa/bbbにa.outとaaaとbbbとcccがあってそこで"../"でopendirしてreaddirすると
/aaaにaaaとbbbとdddがあった場合aaaとbbbだけ見れて後はエラーで終わってるみたいです。
すみません。自分のプログラムのバグでした。
409395:03/11/04 22:10
>>404 まぁ、そんなところです。
syslogだとあらかじめ指定されたファイルにしか出力できない不便さが
ありますから、なんとかしたいな、と思った次第です。
>>409
/dev/logについて調べてみれ
/dev/printerとかよぉ

$ ls -l /dev | egrep ^s
iconv()に関して質問させてください。
ちょっとお伺い立てるべきスレがわからなかったのでマルチになっておりますが申し訳ございません。
static int KONBU(char *to_code, char *from_code, const char **inp, char **outp, size_t *inl, size_t *outl)
{
iconv_t icv_hook;
size_t ret_val;
icv_hook = iconv_open(to_code, from_code);
if(icv_hook == (iconv_t)-1)return(ANS_ERR);// NG Return
ret_val = iconv(icv_hook, inp, inl, outp, outl);
iconv_close(icv_hook);
if(ret_val == (size_t)-1){
if(errno == EILSEQ) printf("EILSEQ\n");
else if (errno == E2BIG) printf("E2BIG\n");
else if (errno == EINVAL) printf("EINVAL\n");
return(ANS_ERR);// NG Return
}
return(ANS_OK);// OK Return
}
上記のようなiconv()を用いた関数があります。
unsinged char *sb, db;
ret = KONBU("JIS7", "PCK",(const char **)&sb,(char **)&db,2,8);
そしてこのように呼び出しており、unchar sbには
83 31 83 32 83 34 ....といったようなデータを渡しています。
実行結果はEINVALが返ってきます。
ここで質問なのですが
@第5引数の2はsbを2バイトずつ読み込むということでよろしいのでしょうか?
A第6引数の8は何を指すのでしょうか?
Bsbには0x81 0x31 ....というようにヘキサを読み込ませているつもりなのですが
そもそも文字列で渡すべきなのでしょうか?
CEINVALのエラーの意味がよくわからない。
以上4点になります。
厨な質問かとは思いますがご教授お願いいたします。
>>411
> @第5引数の2はsbを2バイトずつ読み込むということでよろしいのでしょうか?
> A第6引数の8は何を指すのでしょうか?

そこポインタでしょ。

> ret = KONBU("JIS7", "PCK",(const char **)&sb,(char **)&db,2,8);

は間違った使い方。man iconv

> Bsbには0x81 0x31 ....というようにヘキサを読み込ませているつもりなのですが
> そもそも文字列で渡すべきなのでしょうか?

どうリテラルを表現してもcharには変りないでしょ。

> CEINVALのエラーの意味がよくわからない。

man iconv
>>403
ロガー側は監視プロセスから起動して、ロガーが死んだら再起動するようにする。
(Sytem-V なら inittab とかで何とかなりそう...。)
ログ書き込み側は、ロガーが死んだことを検出したら再接続するようなライブラリを提供して、それを使ってもらう。
414703:03/11/06 03:22
システムコールでユーザ名を得ることってできますか?
user_from_uid(uid(), 0)
としましたが、「uundefined reference to `user_from_uid'」
とエラーになります。user_from_uid がないらしいです。
環境は Debian woody です。
よろしくお願いします。
getpwuid
416703:03/11/06 04:49
>415
できました。ありがとうございます!


417403:03/11/06 19:31
>>413 thanx
cursesライブラリを使ったプログラムを作っています。

最初はprintf()等で画面(=標準出力)に出力していて、
必要になったらinitscr()でウィンドウを確保して画面を更新し、しかる後にendwin()で解放したら
その後は再びprintf()等で画面に出力するということはできないでしょうか?

現在の状態では、endwin()をした後にprintf()で出力しても何も表示されず、
Ctrl-Cで終了させると一気に出力されます。(バッファにたまっているような感じ)

なお、OSはSolaris8(Intel版)を使っています。
>>418
cursesがstdioのバッファを大きくしちゃうのかな。
printfの後にfflushをいれてみるとか。
420418:03/11/08 22:41
>419
素早いレスありがとうございます。
printf()を呼んだ後にfflush(stdout)したら、無事出力されました。

動作を見てみると、出力文字列と確保していた仮想画面が混ざってしまっているみたいです。
"test\nstring"と出力させると、

test
   string

のように、"test(1行分のスペース)string"と出力されます。
また、一度initscr()/endwin()をしてしまったら、その後は
printf()のたびにfflush()しないと出力されないようです。

ちなみに、fprintf(stderr,...)としたら即座に(fflush()しなくても)出力されました。
邪道ですが…。画面が崩れるのは上と同様です。

今は試験用コードとして
initscr();
move(2, 5);
printw("Value: %d", 5);
refresh();
nocbreak();
endwin();
refresh();
としているのですが、呼び足りない関数などありませんでしょうか?
>>420
> "test\nstring"と出力させると、

使った関数書いてよ!
422418=420:03/11/09 01:47
>421
あぁぁ…すいません。
 printf("test\nstring");
として出力させました。
cursesがttyをrawモードにするから。
\n を \r\n にすればいい。
424418=420:03/11/09 03:23
>423
深夜のレス、ありがとうございます。
\nを\r\nに書き換えたところ、正しく(>420の例でいくと"test(改行)string")出力されました。

また、調べていて見つけたresetterm()をendwin();refresh();の後に呼び出したところ、
\nのままで正常に出力されるようになりました。
(rawモードがリセットされたから、ということなのでしょう)

あと一点、fflush()しないと出力が行われないという点なのですが、
こちらも(fflush()を呼ばなくてもいいように)元に戻すことはできないものでしょうか?
resetterm()をしても、この問題は解決されませんでした。
printfは改行コードが来るとflushする仕様なので、改行コードなしの文字列を表示させたければ
fflushしないといけないと思う。
426418=420:03/11/09 04:18
>425
深夜…というよりはもう早朝ですが、レスありがとうございます。
そういう問題があったんですね。
今まで深く考えずにprintf()を使っていましたが、これからは気をつけねば。

改行があれば〜ということで、改行を付加すればよいかと思い
printf("test\r\nstring\r\n");などとしてみたのですが、
残念なことにバッファリングされたままでした。

で、いろいろ調べていて、setlinebuf()を使えば
ストリームをラインバッファに変更できるということがわかったので
resetterm()の後に更にsetlinebuf(stdout);を呼び出したところ、
printf("test\nstring\n");のような呼び出しで正しく出力されるように戻すことができました。


最後になりますが、深夜にもかかわらず多くの助言本当にありがとうございました。
resetterm()してから
setvbuf(stdout, NULL, _IOLBF, 0);
してみ。
シグナルハンドラがどのプロセスからシグナルを送られたか調べる方法はありますか?
お願いします。
>>428
POSIX 1003.1bのsignalがあれば。e.g. Solaris 9
http://www.opengroup.org/onlinepubs/007904975/functions/sigaction.html
430428:03/11/09 23:01
ありがとうございます。
>>426
とりあえずendwin()のあとに、refresh()を呼んでるのが
気持ちわるいと思う。

Solaris8(SPARC)で refresh を外してちょっと試してみたけど、
それでも stdoutがブロックバッファモードになってるみたいで、
setlinebuf(stdout)が必要だった。

ググってみたら、
http://www.mit.edu/afs/athena/contrib/games/src/bsd-games-2.13/battlestar/fly.c
で、
> endwin();
> setvbuf(stdout, NULL, _IOLBF, BUFSIZ); /* Needed for ncurses */
だって。ふーん。
432426:03/11/10 02:14
>>427,431
レスありがとうございます。

>427
setvbuf()でもsetlinebuf()でもやることは同じ、
ただしsetlinebuf()の方は互換性が低い、ということみたいですね。
同じ結果を得られるなら互換性が高い方がいいですし、setvbuf()を使うように変更しようと思います。

>431
試験中はとにかくクリアしてやれとやっていましたけど、
確かに"end"したあとにrefresh()はまずいですね。取り除かねば。

その後試していて、resetterm()を呼ばないとカーソルが左上には戻ってはくれないものの
stdoutをラインバッファに戻せば出力は元に戻るみたいですね。
# resetterm()はendwin()の中で呼ばれるものらしいので、下手に呼ぶべきではないでしょうし。
 カーソルが左上に行ってくれるのはちょっとうれしいですけど…。

何とか解決したかと思っていましたが、
本番の方のプログラムを実行するとプログラムの終了時にシェルが終了してしまうことがわかりました。
ただ、ほぼ同じことをやっている(はずの)試験用コードでは起きない現象なので
これについてはどこか他の部分に原因がありそうです。

追加の情報ありがとうございました。大変勉強になりました。
>>432
> これについてはどこか他の部分に原因がありそうです。

落ちるってのはそのプログラムを実行した対話モードのシェルのこと?
そりゃ、そのシェルが悪いでしょ(w
434426=432:03/11/10 03:05
>433
>落ちるってのはそのプログラムを実行した対話モードのシェルのこと

はい、それのことです。え?と思い試してみたところ

sh -> 落ちない
csh -> 落ちない
bash -> 落ちる(プログラムが終了すると自動的にexitと入力(?)されシェルも終了する)
tcsh -> 落ちる(同上)

という結果になりました。う〜ん…。
しかし、試験コードではどれを使っても落ちませんでしたので、
何かの違いでシェルが終了したりしなかったりしてるんだと思います。
解決までたどり着けるかはわかりませんが、できるところまでコードを追っていこうと思います。
libreadlineとか使うshellは、foregroundなjobが終了した時に、
ttyのmodeを自分好みに戻すでしょ。Ctrl-CとかCtrl-Pとか使いたいからね。で、
$ cat <Return>
などとやる時のために元のモードは常に保存しておくのよ。
それはユーザがsttyしたりして意図してそうした状態であることが多いから。
$ ./a.out <Return> # あなたのprogram
$ stty erase ^h
$ tput どうしたこうした
なんて見分け付かないからね。

で、それが余りにも意表をつく状態だったんでしょうね。
まあ落ちるのはshellが悪いけどね。
>>434
> bash -> 落ちる(プログラムが終了すると自動的にexitと入力(?)されシェルも終了する)
落ちるっていうか、EOFと見なされてるんだろうな。
437デフォルトの名無しさん:03/11/15 18:34
UNIXネットワークプログラミングVol.1の4章を読んでいて思ったのですが、
UNIX上のプログラミングを極めるというのは、その実装の歴史をよく
理解していないとダメなんですかね。4.1cBSDではどうだったとかの話しが
出てくるあたりは流石に閉口しました。
つまらないなら読み飛ばせばいいでしょう。
>>438
UNIXを  極  め  た  い  んです
>>439
http://pc.2ch.net/unix/
バイバイ
>>439
> UNIXを  極  め  た  い  んです
あんたじゃ無理。
他のことに時間使った方がいいよ。
>>441
女の子とデートしたりエッチしたり、結婚して子供育てたり
他に楽しい事やるべきことは沢山ありますからね。
それでもUNIXのカルトQってあったら見たい
>>439
カーニハン、パイク「UNIXプログラミング環境」アスキーは必ず読めよ。
http://www.amazon.co.jp/exec/obidos/ASIN/4871483517
>>441
それは余計なお世話だろ。
読んどけ
http://www.tuhs.org/
全員五つ星の評価か。
訳者の自作自演だな
>>447
え!? >>444の本の話? 当然の評価じゃない?
当時のAT&T系UNIXに合わせた内容であること以外に欠点が見つからない…
>>448
古い
450デフォルトの名無しさん:03/11/19 23:09
age
書き込みがないぞ(-_-;)
やっぱりみんな emacs 使って開発してるの?
自慢の開発環境を教えて下さい。
catでデバドラ書きます。
>>453
ネタは無用
vi でちまちまやるのが好きです。
onSiteならmule、offSiteならxyzzy。
xyzzyってなんと読むの?じじぃ?
POSIX regex (言語はC)では、正規表現の括弧内が文字列のどの部分にマッチしたか
とか調べられないわけですか?
られます。
460デフォルトの名無しさん:03/12/10 11:07
終了時にデータをファイルに保存したいのですが、
トラップするシグナルは SIGINT SIGTERM SIGKILL でいいですか?
SIGQUITとかあったと思った
SIGKILLはトラップできないと思った
SIGHUPもな。
unix 詳しくないんで間違ってる可能性大だけど、標準入出力を close しないで動いてるなら
SIGPIPE もトラップしといた方が良いような。。。
SIGABRTとか・・・
バグで落ちることもあるからSIGSEGVも
467デフォルトの名無しさん:03/12/11 20:23
んじゃ、SIGBUSも
unixプログラミングって何ですか?
winのプログラミングと何か違うんですか?
システムコールが違うぐらいで
あとは同じだよ
470デフォルトの名無しさん:03/12/14 23:12
POSIXってなんすか?
対MSのためにunixベンダが集まって、マチマチだったunix方面の
システムコール/ライブラリの仕様を統一(しようと)したもの。

まあ所詮烏合の衆だったわけで、そんなに大層なものじゃない。
(準拠しているからといって、素晴らしい恩恵に授かれるわけではない)
>対MSのために
は?
>対MSのために
は?
 LinuxなどのUNIX系OS以外にも、Windows NTは当初よりPOSIXサポートを
行っており、POSIXサブシステムにおいてPOSIX仕様のプログラムを実行
できるようになっている(Windows NTの後継であるWindows 2000でもPOSIX
サポートはそのまま引き継がれている)。これは主に、1980年代の中盤から
後半にかけて、米国政府機関のコンピュータ・システムの導入要件
(National Institute of Standards and TechnologyのFIPS:Federal
Information Processing Standards)として、このPOSIX準拠であることが
策定されたためである。
linusがsocklen_tについて文句言ってたなあ
まあ烏合の衆というのもわかる
>>475
意味不明
VC++にあるF12で定義を見つけてくれる機能をもったツールってありますでしょうか?
>>477
ctags?
素直にgrepするとか。

ctagsって関数だけですよね。
defineとかtypedefとかはgrepだと、ifdefとか混ざってるときどうすれば効率的なんでしょうか?
>>479
> ctagsって関数だけですよね。
> defineとかtypedefとか
使える。
481479:03/12/15 14:50
まじですか。ちょっと調べてみます。
GNU Global > ctags
Globalは100倍ぐらいの巨大なTAGファイル吐き出すけど、
それでもみんな使ってるの?
百倍て。適材適所
485デフォルトの名無しさん:03/12/15 23:12
いまWin->UNIX(AIX)の移植をやっているのですが、
そのコード内に以下のような処理があります。

try{
HMODULE mydll = LoadLibrary("mydll");
〜ここでLoadLibraryで読んだDLL内の関数を使用〜
〜その他、いろいろな処理〜
}
catch(...){
〜エラー処理(システム例外も含む)〜
}

ここでやりたい事はLoadLibraryで読んだDLL内の関数で
システム例外が発生した場合にそのエラー処理をcatchでやろうとしています
(ちなみにこの処理は複数スレッドで動いています)

Winだとシステム例外もcatchできるのでよいのですが、
UNIXだとtry〜catchではシステム例外(割り込み)は捕まえられないですよね?
多分シグナルハンドラとか設定しないとダメな気がするのですが、他に良い方法はありませんか?
UNIX系(特にシグナル)はあまり詳しくないので困っています。
ご存知の方がいたら教えてください。
486デフォルトの名無しさん:03/12/15 23:22
lrwxr-xr-x とかdr-xr-xr-x の意味を知りたいのですが
解説のページが見つからない・・・
488486 :03/12/15 23:33
>>487
うほっ 素早い回答カッコイイ。  感謝です。
489デフォルトの名無しさん:03/12/16 01:56
pid_t pid;
if(fork==0){
execl(/usr/local/bin/xxxx", "xxxx", result_filename, input_filename);
}
else{
int status;
wait(&status);
}

上のようにxxxxを実行すると、結果格納ファイルであるresult_filenameが文字化けします。
しかし、

const char *ch="xxxx result_filename input_filename"
system(ch);

というように実行するとresult_filenameは文字化けしません。
自分には全く原因がわからないんですが、何故なんでしょうか?
490デフォルトの名無しさん:03/12/16 01:58
pid_t fork_result = fork();
if( fork_result == 0){

上から2行は↑でした、すいません。
491デフォルトの名無しさん:03/12/16 02:01
>>489
とりあえず、execlの最後の引数は(char *)0でなければならない。
492デフォルトの名無しさん:03/12/16 02:03
>>491
そうでした、引数の最後にNULL付けるの忘れてました・・・_| ̄|○
こんなんに何時間も悩んだ俺に鬱
493デフォルトの名無しさん:03/12/16 02:04
それと、const char *ch="xxxx result_filename input_filename" のresult_filenameとinput_filenameはきちんと展開したものになっているのか?
>>485
Windowsと同じような動きをさせるのは無理。あきらめろ。
質問させてください。
Sun OS Soralis8での話なのですが
他スレで環境依存ということでこちらにこさせていただきました。
iconv()でSJIS("PCK")からJIS("ISO-2022-JP")に変換する際に
ソースデータがバイナリで
8F 40 8F 41 8F 42 8F 43 8F 44 8F 45 20 8F 46
の15バイトだった場合、@iconv()は0x20を見つけた時どういった
処理をする仕様なのでしょうか?
Aまた、もし変換及び無変換もせずにそこで処理の中断をしてしまうなら
0x20などの処理はどのようにするのが妥当でしょうか?
Bsize_t iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
上記ソースを読む場合引数のsize_t *inbytesleftにはいっぺんに15バイト読ませて
しまってよいものなのでしょうか?

分かり辛い質問で恐縮ですが、以上3つの質問になります。
ご教授お願いいたします。
>>495
iconv() の、というより変換テーブルの仕様ではないかと。
ならばやってみれば判る筈…ていうか、PCK て何??

  % od -tx1 t.tmp
  0000000 8f 40 8f 41 8f 42 8f 43 8f 44 8f 45 20 8f 46 0a
  0000020
  % iconv -f SJIS -t ISO-2022-JP t.tmp | od -tx1
  0000000 1b 24 42 3d 21 3d 22 3d 23 3d 24 3d 25 3d 26 1b
  0000020 28 4a 20 1b 24 42 3d 27 1b 28 4a 0a
  0000034
  %

  ESC 2/4 4/2 (X 0208 漢字) に続いて空白の前まで、
  ESC 2/8 4/10 (X 0201 ローマ字) に続いて空白、
  ESC 2/4 4/2 に続いて空白の次から、
  ESC 2/8 4/10 で終端。
497教えてください:03/12/16 16:43
Linux Cで教えて頂きたいことがあります。

Solarisでは/proc/<数字>/配下のファイルからプロセス情報の取得が
できたのですが,Linuxでは同様の方法では取得できませんでした。
欲しい情報は対象となるプロセスのUID,GID,ファイル名,
プロセス実行開始時間です。
調べてみるとtask_structという構造体を使用するようなのですが,
さっぱりわかりません。

よろしくお願い致します。
>>497
マルチUzeeee
499デフォルトの名無しさん:03/12/16 18:20
c++を勉強しようと思ってるんですが、
linuxでc++使うことはできるんですか?
できます
↓はい次
シグナルハンドラの中で例外を投げたらどうなるんだろう。
許されてることなのかなぁ?
あとシグナルハンドラからlongjmpとか。
>>501
やめてくだせぇ
>>501
誰もcatchしないから死ぬよ
longjmp は ok でそ。
お作法として薦められるかどうかはともかく。
>>504
シグナルハンドラから戻れなくなるんでは?
OSによると思うけど。
>>505
うん。戻らない。でも普通の unix なら別段問題ない。

信用できないデータの高速な処理等で、SIGSEGV とかをトラップして
頑強に処理を続けるために上位ループのエラー回復処理に戻る等で使う。
_longjmp()って何のためにあるか知ってる?
シグナルハンドラで使用禁止されたら存在意義がなくなる。
>>507

async signal safe でない関数を呼ぶたびに sigprocmask で
シグナルを抑制したり許可したりすれば確かに一応使えるけど、
初心者にはお勧めできない。
存在意義がないわけではないが、2ch で質問するようなレベルの
人は使わない方が安全かと。
509507:03/12/17 23:23
507 は説明不足だった。

漏れの認識では、
longjmp() はシグナルハンドラ用。
_longjmp() はシグナルハンドラでは使えないけど、高速っていう感じ。
それをいうならsiglongjmp()
馬鹿ばっか(w
longjmpなんか使うなよおめーら
元の質問はC++ってことのはずだから、(>>499,>>501)
longjmpなんかしちゃダメでしょ。
blockのdtor呼ばれないよ。

signal handlerと例外の美しい融合はないもんかねえ。
>>513
signal handler で例外投げれば適当に rewind してくれるってのがいいんじゃない?
従来の longjmp 的使い方なら上のほうで catch しとけば良いし。
515>>513:03/12/19 08:09
>>514
> signal handler で例外投げれば適当に rewind してくれるってのがいいんじゃない?

そんな使い方はサポートされてません。
ANSI C++ではsignalを定義してません。(ANSI Cにはある)

何故できないのかはsigreturn(2)辺りを勉強するよし。
実装codeも読んでみてね。
>>515
頭おかしいんじゃねーの?
517>>513:03/12/19 10:19
>>516
何故?

C++でsignal handlerからlongjmpはまあいいとしても例外はまずい。
漏れは 514 だが、>>514>>513
>signal handlerと例外の美しい融合はないもんかねえ。
へのコメントであって、現行の ANSI C++仕様の説明をしたつもりはないぞ。
っていうか何で 514 が今サポートされてるように読めるのよ。。

>>517
signal handler から throw するあたりへの突っ込みじゃなくて、
ここはあくまでも「UNIX プログラミング」スレだから、signal は C++ でも
それなりに必須に近い api なわけで、ANSI C++ で定義されてないからナニ?
仕様厨は仕様スレ行けば、ってことだと思う。
514が、C++の例外のセマンティクスや async signal safe の
要件を理解しているとはとても思えないなあ。

515が正しいよ。なぜ514みたいなのが仕様として許されてい
ないかというと、そもそも実装不能だからなんだよ。言語
処理系のサポートする例外っていうのは、例外の発生する
タイミングを処理系が完璧に把握できることを前提に設計
されているのに、signal はアプリケーションとは非同期に
発生するから、そもそも実装の前提を満たしてないのだ。
もちろん、処理系の想定してないところに signal を
block する処理を加えるのなら、例外処理の方の要件を
満たすことはできるが、そんなことすると目茶苦茶遅く
なるし、なにより signal の意味をなさなくなる。

…という話なんだが、なんで自信満々に仕様厨とか言って切り
捨てられるじゃろ? 仕様ってのは、無意味に決まってるもん
じゃないんだよ。常識でしょ。
>>515で「ANSI C++ではsignalを定義してません」 なんてこと書くから仕様厨って
言われたんじゃない?じゃああんたは signal 使わないの、ってこと。

signal ハンドラ中からの throw の実装が非現実的というのには同意。
一般に signal が raise するときのスタック状況なんて予見不能だから、
unwind (rewind じゃないよね) 出来ない。スタックフレームのアドレスだけを
覚えておく別のスタックを使えばできるけど、いまさら C++ にそんな拡張が
されても……って感じだし。
自作自演もたいがいにしろよ
522>>513:03/12/20 07:59
>>518
> それなりに必須に近い api なわけで、ANSI C++ で定義されてないからナニ?
> 仕様厨は仕様スレ行けば、ってことだと思う。

もうちょっと勉強してください。それとも黙るか。
>>522
ここはCスレでもC++スレでもなく、UNIXプログラミングスレッドだということがわからないの?
UNIXで現在時刻を1秒より良い精度で取得するためのAPIって用意されてませんか?
microtimeやnanotimeはカーネル内でしか使えないっぽいですし...
525507:03/12/20 09:22
>>524
gettimeofday(2)
ちっ、変な名前が入っちまった。
gettimeofdayに期待しすぎるなよ。 > 524
きっと幻滅するから。
>>526
なぜですか?
tv_usecはμsec単位にはなってるけど、普通そんな精度はとてもじゃないが出
ないから。か?
>>523
C++の例外とUNIXのsignalの連携の話だから、UNIXの話でしょ。
>>519の言っているようなこと。

>>515のsigreturn(2)とか。
System call中に起きたsignalのsignal handerから返る時は、
一度kernelに返って、kernelからEINTRでsystem call復帰して、
んでもって、longjumpなり、throwなり、って手順が必要なのよ。
>>515の言うようにコード読んでみれ。
glibcだと、sysdeps/unix/sysv/linux/sig*あたり。
>>529
ANSI C++にsignalがあるかどうかという話のどこがUNIXの話なんだ?
519のどこがANSI C++にあるかどうかなんて話をしてるんですか。
515のsigreturn(2)って言ったら、ANSI C++の話じゃな
くて、明らかにUNIXの実装の話だな。

もっとも不勉強な奴は、sigreturn(2)がUNIX特有の話
じゃなくて、ANSI の話だと誤解するかもしれん。
具体的な実装の話に対して仕様厨なんて言ってたわけ
だから、まあ誤解してたんでそ。
>>533
>>515
「ANSI C++ではsignalを定義してません。(ANSI Cにはある)」
こんなことを言うからでしょ?

ところで、本当にないのかな。↓これには書いてあるようにみえるけど。
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
>>534
ちゃんと方向の示してある後半が理解できないからっていって、
前半だけにかみつくのも悪いでしょう。

ansi_iso_iec_14882_1998.pdf、index見てもみつからないね。
>>534

そのすぐ後に「何故できないのかは…実装codeも読んでみてね」
って書いてあるでしょ。仕様だから実装されてないって主張して
るならともかく、実装上の理由で無理って書いているのに仕様厨
とは、これいかに?
sigreturn(2)って何か知らない上に、調べることもしない人だから…
538534:03/12/21 00:29
俺は514でも516でもないんだけど。

>>535
Acrobat Readerの検索機能を使うとcsignalのところに出てくるよ。
539524:03/12/21 19:00
>>525-528
ありがとうございます.
とりあえずms程度で取れれば問題ないので十分です♪
>539
msecの分解能があればいいけどね。
>>540
普通は大丈夫
うちは普通じゃない(´・ω・`)
543デフォルトの名無しさん:04/01/05 14:24
PCFかBDFを読み込むライブラリってありませんか?
imlib
libmagick
gdk-pixbuf
545デフォルトの名無しさん:04/01/09 22:51
あるプロセスAと他のプロセスB(親プロセスも含む)があったとき、Aは処理が完了した
ということをBに対して通知するにはどのようにすればよいのでしょうか?
ただしプロセスAは完了通知を行った後もデーモンとして処理を継続し、
それを受け取ったBはその後終了します。あと通知は1回だけしかしません。

BでwaitpidをするとプロセスAが終わるまで待たされてしまうので駄目でしたが、
何かよい方法を教えていただきたいです。よろしくお願いします。
>>545 (named) pipe
>>545 kill
>>546
FIFOがどうしたとかいうものでしたっけ?googleで調べてみます。

>>547
killでも通知するようにできるのですか?
プロセスが存在するか終了させるかしか知らなかったです。これも調べてみます。
シグナルは確実性がないからおすすめしません。
>>549
いつの話だ。
551545:04/01/10 01:00
質問の中で間違えたところがありました。プロセスBは通知を受けて終了する
のではなくて、通知を受けた後もまだ自身の処理を続行するようにします。
>>547さんすみません。
ふつー、kill
killなんて単語、使わないで欲しいよな。
creatよりはいいだろう。
>>551
killを調べた結果、この発言をしたのならば
>>551が何を言いたいか理解できない。
釣りですか?
調べてないと推論するべきだ。
多分コマンドラインでkill -1とかやったこと無いんだよ
558デフォルトの名無しさん:04/01/15 01:15
あるプロセスが、setrlimit(2) の RLIMIT_DATA のソフトリミットに掛かったことを
自身で知るにはどうしたら良いでしょうか? RLIMIT_CPU であれば XCPU シグナルを
トラップすることで実現できます。ちなみに、対象 OS は FreeBSD です。
>>558
getlimit(2)
     The system refuses to extend the data or stack space when the limits
     would be exceeded in the normal way: a brk(2) function fails if the data
     space limit is reached.
では?
>>558
シグナルで知る方法はないんじゃないか ?
sbrk をラップしてそこでチェックするのが簡単だと思う。
561558:04/01/15 13:19
>>559 >>560 サンクスコでございます。調べてみます。
>>558
というか普通にmalloc使ってりゃ、NULL返された時がそうだよ。
563名無しさん:04/01/16 08:00
質問なんですが、BPFを使い、パケットフィルタリングすると
printf文が使えなくなります。なぜでしょうか?

fprintf(stderr, "test ");
などのような標準エラー出力は表示することができます。

また、参考までに、BPFはプロミスキャスモードと即時モードで動作させています。
564デフォルトの名無しさん:04/01/16 08:56
一冊だけで わからないような教科書を作るのは、出版会社の陰謀ですな。
565名無しさん:04/01/16 10:03
>>563 の追加情報です。

int test;
test = printf("test");
fprintf(stderr,"test=%d",test);

これをプログラムに内蔵して実行してみると、

test=4

と表示されました。つまり、printfがエラーになったわけではないと推測されます。

BPFを使うことにより、printfなどの標準出力が、画面ではなく、
他の何かに切り替わったんですかね??

分かる方いらっしゃいましたらよろしくお願いします。
つかBPFって何者だよ?
つかパケットフィルタリングすると stdout がおきかわるってどういう環境だよ?
きっとtcpdumpをコンパイルするのにprintfを全部fprintf(stderr,...)に
置換する環境なんだよ。うちにはそんなのないから知らない。

>>565
debugger使えや。
>>568
stderrにも出力されてないじゃん。>>565
とにかくgdb, strace, ltrace。話はそれから。
OSは何?

BPFを使えば短いコード(どこかのサンプルコード)でも
その現象は起こるのか?起こらなければ別の問題かもしれない。

あと、これで解決するとは思えないけれど
printfのあとにfflushを呼んでみては?
572デフォルトの名無しさん:04/01/17 08:32
>>571
UNIX
SCO UNIXでつか?
UNIXといえば4.2BSDでしょ
アフォ。UNIXと呼べるのはV7までだ。
Apollo Domain/OS SR10.4.1と予想してみる。
UNIX と呼べるのは UNIX だけ。間違い無い。
おれおれ。俺がUNIXを作ったんだ。
私のためじゃなく、この子のために認知してください。
>>578
Ken Thompson さん乙!
>>542-543
この空白は何。
582デフォルトの名無しさん:04/01/18 19:46
Cプログラムでシェルコマンドを実行したいのですが
どのように行えばいいのですか?
shell()
584デフォルトの名無しさん:04/01/18 20:14
>>582
system
fork & exec
586デフォルトの名無しさん:04/01/18 20:25
>>583 >>584
できました.即レスありがとう.
587デフォルトの名無しさん:04/01/19 09:24
Windowsの #pragma comment(lib, "hoge.lib") みたいに、
使用するライブラリをソース中に書くことはできませんでしょうか。
できません。
いや、漏れが知らないだけで、
そんな変態機能を実装した処理系がどっかにないとも限らんけど。
>>587
リンカスクリプトになるんじゃないの?よく知らないけど、
ソース中にそんな表記があったの見たことない。

質問です。
glibcをビルドしていて*.mapというファイルが出来上がったのですが、
これの書式や意味について説明してあるドキュメントはないでしょうか?
>>589
gccで?
そんなファイル作ったっけ。中身は?
>>590
http://www.sra.co.jp/wingnut/ld/ld-ja_3.html
>リンカスクリプトの主目的は,入力ファイルのセクションを
>出力ファイルにどのようにマッピングするか,そして,
>出力ファイルのメモリレイアウトを調整することである.

スマソ、全然違った。gccって基本的には
コンパイラ -> アセンブラ -> リンカ
っていう作業の流れに忠実だからソース中にリンクフェースのことを
書いたりするのはおかしいっていう考えなんじゃない?

リンクしたいライブラリを指定したいならgccのオプションLD_RUN_PATHで
パスを指定するだけでいいじゃん。つまりMakefileに書くということ。
592デフォルトの名無しさん:04/01/19 10:17
プリプロセッサはどうした。
自己レスですが、自分で貼り付けていたldに関するURLに*.mapの意味が
書いてありました。
http://www.sra.co.jp/wingnut/ld/ld-ja_3.html#SEC40
VERSIONコマンドをファイルに書きだしたものが*.mapだったようです。
これをldもしくはgccに対して--version-scriptオプションで指定すると。
>>589
リンカスクリプトなら
input(hoge.a)
だな。
Makefileで指定するべきだと思うが。

>>590
わざわざ書かなくても普通は用意されてる。
595デフォルトの名無しさん:04/01/19 14:20
fork() を使用したときに,子プロセスから親プロセスの
変数を変更したり,その逆をしたりできますか.
どうしたらいいか教えて下さい.
mmap
shared memory
598デフォルトの名無しさん:04/01/19 21:52
ディレクトリ内の名前の分からない全ての
.cファイルの名前を拡張子だけ変更するシェルスクリプトは
どう書いたらいいですか?
abc.c -> abc.txt
def.c -> def.txt
みたいな.

ここシェルスクリプトもオッケーなんだっけ?

>>598
これで取り敢えず出来たよ。

#! /bin/sh
for i in *.c; do j=`echo $i | sed 's/.c/.txt/'`; mv $i $j; done
>>598
いつもこんなんでやってます。
for f in *.c; do mv $f `echo $f|sed s/\.c/\.txt/`; done
もっと簡単にできそうな気がするので、添削して下さい。
zsh:
% for f in *.c; mv $f $f:r.txt

csh/tcsh:
> foreach f (*.cc)
foreach? echo $f $f:r.txt
foreach? end

sh:
for f in *.c; do mv $f `expr $f : '\(.*\)\.c'`.txt; done
602599:04/01/19 22:15
ごめん。あげちゃったけど良いよね。

>>600 さんのと比べて、自分はすぐ変数化してしまうのは悪い癖だ・・・。
せっかく関数型言語勉強したのに・・・。
perlが入ってると、renameコマンドがinstallされてない?

$ rename 's/.c$/.txt/' *.c

$ rename
Usage: rename [-v] [-n] [-f] perlexpr [filenames]

# perlexprとは恐ろしいコマンドだ…
>>603
そういうことはせめて自分でperlをインストールしてから言おうね。

自分のつかっている特定の環境での話を、一般的なものだと思い込まないように。
>>604
はいはい
>>605 はいは一回。
bash, ksh:
for f in *.c; do mv $f ${f%.c}.txt; done
シェルスクリプトはBashならLinux板、
それ以外ならUNIX板のくだ質スレに逝け。スレ違い。
>>608
ハァ?
>>608

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

1 :デフォルトの名無しさん :03/06/09 07:21
UNIXおよびUNIX clone環境一般のプログラミングに関する質問スレッド
UNIXプログラミングと言えばCに決まってるだろ。
シェルスクリプトがプログラミング?!
SunOSでもNEWSでもRisc/OSでもbash使ってましたが何か?
>>611
ハァ?
614デフォルトの名無しさん:04/01/24 01:23
execvをする前にsetpgrpするのと,execvで呼ぶプログラムの中でsetpgrpする
のは何が異なるのでしょうか?
if(fork() == 0){
 setpgrp();
 execv(a, b);
}
>>614
http://www.opengroup.org/onlinepubs/007904975/functions/setsid.html

UNIXによって違うから要注意な。特にBSD。
616デフォルトの名無しさん:04/01/24 15:46
パイプやソケットで、クライアントはひたすら write(2) を続け、サーバは
ひたすら read(2) を続けるようなものを作っています。

極端にサーバの処理速度が劣る場合には read が間に合わなくて、そのうち
クライアントの write はバッファが詰まって書き込めずにブロックして
しまいます。これを防ぐにはどうしたら良いでしょう? ステータスを交換
し合って同期を保証するしかないですか?
>>616
> write はバッファが詰まって書き込めずにブロックしてしまいます。

既に同期が取れていると思うけど...。

何を防ぎたいのかよくわからん。
writeする前にselect(2)でwritefdsをチェックしる。
619616:04/01/24 16:43
>>617 説明不足でした。あえてデータを取りこぼす仕組みを作っているのでした。
>>618 なるほど。こういう場合にも select(2) が有効なのですか。多分無理なん
じゃないかなーと勝手に思い込んでました。サンクスコです。
> あえてデータを取りこぼす仕組み

なにそれ?
621616:04/01/24 16:53
>>620 勉強というか遊びというかなので、そこは気にしないでください。
データをとりこぼしたいならば、
単に non blocking mode にすればいいような気がする。
TCPで取りこぼすってどういうこっちゃ
送信側の速度 >> 受信側の速度 だから、どっかで捨てるしかないわけだろ。
TCP は捨ててくれないから、プログラムでやるって言う話だと思うけど。

それこそ適当に捨ててくれれば言いと言うなら、>>622 が正解だと思う。

でも普通データにはなんからの塊があって塊の単位で捨てて欲しいんじゃないかなぁ...。
625616:04/01/24 17:19
垂れ流すデータは、ログみたいに行単位のテキストです。適当な行を
捨ててくれれば目的は達成でございます。
>>625
適当に捨てられたら...

> 垂れ流すデータは、ログみたいに行単位の目的は達成でございます。

とかなっちゃうかもしれないよ ?

TCP のスタックには、行なんていう概念がないんだからさ。
627デフォルトの名無しさん:04/02/04 14:57
*BSDに入っているcursesとLinuxにあるncursesとは
まったくの別物ですか?またそれらについて勉強するのに
いいドキュメントなどはありますか?やはりソースで
学ぶしかないですかね。
スレ立てるまでもない質問スレでcurses使う奴はアフォでUNIX初心者だって言われた。
なんでだろ。
>>628
なんでですかね。Emacsやviだってこれを使って実装してるのに。
ドキュメントはncursesについているinfoでいいんじゃない?
Wide character版使わないと日本語が駄目。

Emacsは、ほんのちょっとしか使ってないよ。ほとんど自前。
>>628
何の質問だか知らないけど、使わなくていいところで使うような回答したんじゃ?
632デフォルトの名無しさん:04/02/04 23:13
かなりマルチで申し訳ないんですが質問です。 (ここで聞くのが最適かと・・・
C言語でfopenでファイルを開くときWindowsの場合、テキスト形式で開いてたら
0x1AをEOFと判断して、バイナリだと0x1AをEOFと判断しないと聞きました。
それでUnixの場合はバイナリでもテキストでも一緒とも聞いたんですが、それではUnix系はどうやってファイルの終端を確認しているんですか?
Unixのファイル終端の識別子はなんなんですか?
633デフォルトの名無しさん:04/02/04 23:14
>>632
Windowsでバイナリ形式で開いてたらどうやって終端を判断するんですか?
634632:04/02/04 23:19
え〜・・・・ スイマセン勉強不足です・・・分かりません。
>>632
ファイルの中のデータじゃなくて、
ファイルの属性としてファイルのサイズを持っています。
だから終端文字がなくても分かります。

MS-DOS/Windowsもそうですが、
先祖のCP/Mがblock単位のファイルサイズしか持ってなかったので、
Ctrl-Zを終端文字とするスタイルを踏襲しています。
要するにCP/Mではバイナリファイルはブロック単位の長さしか持つことができなかったのです。
またテキストファイルはCtrl-Zをデータとして持つことができませんでした。

C/UNIXがこの問題に大きな簡潔さをもたらしたことが分かるでしょう。

ちなみに、終端文字を設定するとすれば、
Ctrl-Zでなくて、転送終了を表すCtrl-D(EOT)が適当だったと思いますね。
636632:04/02/05 00:56
>>635
なるほど、丁寧にありがとうございます。分かりました。
637632:04/02/05 01:08
何回もすいません。
Unixで作られたファイルをWindowsに送った場合っていうのはWindowsはどう処理するのでしょう?
一応スタイルとしてはCP/Mの方法をとっているが、Unixファイルの場合は属性としてファイルのサイズを理解して処理できるのでしょうか?
つかunixでもなんでもない。
せめてWindowsでまともにファイルを扱えるようになってからもう一度いらっしゃい。
639デフォルトの名無しさん:04/02/05 01:13
EOFは過去の遺物
>>637
FTPプロトコルを参考にしてください。

アスキー(テキスト)転送とバイナリ転送を分けてます。
そしてアスキー転送の時は、サーバ側が、
改行とファイル終端についてデータ変換を行います。

MS-DOS/Windowsの世界でも、stdioが同様の変換を行っています。
Cの世界からは、UNIXライクにテキストファイルが見える必要がありますから。

> Windowsはどう処理するのでしょう?

こういう質問の仕方は板違いですから勘弁してください。
UnixスタイルのテキストファイルはWindowsでも普通はそのまま読める。
Visual C++やBorland C、mingwなどでコンパイルしたプログラムなら。

これ以上はスレ違い。
642632:04/02/05 17:53
皆さんありがとうございます。
SFUもここでいいのかな?
http://www.microsoft.com/japan/windows/sfu/
UNIX版にスレあるけど、プログラミングならここでもいいんじゃない?
645デフォルトの名無しさん:04/02/08 00:10
メモリリークに関して質問です
フリーのメモリリークチェックツール(ccmalloc)なるものを使っているので
すが、getaddrinfoでmallocされた領域をfreeaddrinfoで解放してもリークが
発生しているようなログが出ます。
本当に漏れてるのか?そしてあれば完全に解放する術を教えて下さい

使用OSは Vine Linux 2.6
コンパイラは g++ 2.95.3

一応ソース添付
int main(){
addrinfo hints, *AI;

memset(&hints, '\0', sizeof(hints));
hints.ai_family = PF_INET;
hints.ai_socktype = SOCK_DGRAM;

if(getaddrinfo("localhost", "13000", &hints, &AI) != 0){
cout << "Error: getaddrinfo" << endl;
return 1;
}

freeaddrinfo(AI);
return 0;
}
>>645
ぱっと見、getaddrinfo() で、複数の addrinfo 構造体が割り当てられたんじゃないか ?
getaddrinfo() 呼び出したあとで、AI.ai_next が NULL になっているかどうか確認してみて。
647デフォルトの名無しさん:04/02/08 01:39
>>646
645です。以下のコードをfreeaddrinfo()後に挿入して実験を行いました
if(AI->ai_next == NULL)
cout << "ai_next is NULL" << endl;
結果、"ai_next is NULL"が表示されました。
検索しててどっかで見かけたfreeaddrinfoのマニュアルでも、getで動的に
作られたリストが無くなるまでfreeするような事が書かれてありました
>>645
getaddrinfoのソース見た方が早いんじゃない?
あと、ccmallocのソースも。
/etc/hosts とかはmallocした領域にキャッシュされるしな。そのへんじゃないか?
getaddrinfoのソース見るしかないと思われ。
>>645
glibcのバージョンは?
652デフォルトの名無しさん:04/02/08 13:48
linuxでgccでプログラムしてるんですが
winapiのGetCommandLine()に該当する関数がわかりません。
どうか教えてください。

通常はmainの引数を使えばいいのでしょうが
グローバル変数としてインスタンス化されたオブジェクトの中で
オプションを使いたいので、mainに入る前にオプションが知りたいんです
653デフォルトの名無しさん:04/02/08 13:55
スタートアップルーチンのソース調べてarg[0]にセットしてるとこ
探してはどうか?
gccってグローバル変数にセットしてくれてた気がする

でもなあ、明示的に初期化メソッドを呼んであげたほうが
いいと思うよ。グローバル変数の初期化の呼び出し順序って
事実上コントロールできないし。

つか「mainに入る前」にいろいろやるのはおすすめできないなあ・・・
655デフォルトの名無しさん:04/02/08 14:40
>>653>スタートアップルーチンのソース調べてarg[0]にセットしてるとこ 探してはどうか?
>>654 >gccってグローバル変数にセットしてくれてた気がする

ありがとうございます。さっそく調べて見ます。

>>654
グローバル変数の初期化の呼び出し順序・・というのは知っているのですが
人の作ったプログラム解析していたら、グロバール変数としてスレッドを作るオブジェクトが
指定されてて、しかもそれがおかしいみたいなので、色々試すのにコンパイルの手間を省くため
コマンドラインから通り道や、属性などを変えられないかなーと思った訳です。

素直にgdb使った方が良いような気もしますが・・・
>>655
環境変数使えば?
>>655
> グロバール変数としてスレッドを作るオブジェクトが
> 指定されてて、

それ作った奴はシロウトっぽいな
略:窓の外に放り投げるAA
658デフォルトの名無しさん:04/02/08 20:53
>>651
645です。glibcのバージョンは2.2.4です
>>658
バージョンあげてみ。
>>659
mallocされたままの領域増えてたりして。
>>645
皆がいうようにソース見るのが常道かつ早道。
661デフォルトの名無しさん:04/02/09 00:57
ごめんなさい、645ですが追加質問です。
とりあえず自分のマシンにはlibcのソースを入れてなかったみたいなので
どうせならソース見るついでに最新版にしておこうと思ってます。
で、今入ってる2.2.4はrpmでインストールされてるんですが、ソースから
インストールする時は前の版のものはどうすればよいでしょうか
linux板いけ
663デフォルトの名無しさん:04/02/09 23:54
どれどれ、linuxプログラミング質問スレでも立てるとするか
>>661
先にlib側のrpmを削除してから入れなおせ
rpmの扱いとかはム板の範疇じゃないからlinux板へ行けということだと思うが。
でも隔離スレとしてあってもいいかも>linuxプログラミング質問スレ

666デフォルトの名無しさん:04/02/10 07:26

ひょっとしたらスレ違いかもしれないですが、一応UNIXなんでココに書きます。

pthreadにおいて作成したスレッドに対して、そのスレッドがまだ動作しているかどうか調べるには
どうしたらいいですか??
668デフォルトの名無しさん:04/02/11 15:25
BSD系OSで OS起動時にrootとしてデーモンを立ち上げたいのですが、
どこに設定すればいいか分かる人いませんか?

inetdやcrondでは使用目的に合わないため、単独でデーモンプロセスを立ち上げたいです。
669デフォルトの名無しさん:04/02/11 15:28
>>668
プログラミングとなんの関係もないのでUNIX板で聞いてください。
670デフォルトの名無しさん:04/02/11 16:06
座標の変数xとyが与えられたとき、
第1から第4のどの象限に属するのか調べるには
どうすればいいんですか?
>>670
UNIXとなんの関係もないのでスレたてるまでもない質問スレで聞いてください。
672デフォルトの名無しさん:04/02/11 17:13
>>671
UNIX上で開発しているんですが。
         \   ∩─ー、    ====
           \/ ● 、_ `ヽ   ======
           / \( ●  ● |つ
           |   X_入__ノ   ミ   そんな餌で俺様が釣られクマ―!
            、 (_/   ノ /⌒l
            /\___ノ゙_/  /  =====
            〈         __ノ  ====
            \ \_    \
             \___)     \   ======   (´⌒
                \   ___ \__  (´⌒;;(´⌒;;
                  \___)___)(´;;⌒  (´⌒;;  ズザザザ
                               (´⌒; (´⌒;;
>>670
中学1年レベルの数学だな(w
675デフォルトの名無しさん:04/02/14 16:13
forkした後の子プロセスがさらにforkして、孫プロセスがデーモンとして
動くようにするのは常套手段でしょうか?
>>675
なんで聞いているか分からんけど、常套手段じゃないでしょうか?
daemon()の方が楽だけど。
daemontools のほうが楽。
678デフォルトの名無しさん:04/02/14 17:08
fork、execv、setpgrpを使ってデーモンとしてプロセスを動かそうとテスト
してるのですが、以下の2つで何が変わってくるのかわからなくて質問しました。
ググってみたら2のやり方をしているのを発見しましたが、その意味がどうも…。
1.子プロセスを直接デーモンとして動かす
2.孫プロセスをデーモンとして動かし、子プロセスはすぐ終了する
>>678
ゾンビとか defunct とかって話 ?
initに看取ってもらうようにするんだろ。
>679
ゾンビプロセスとは、子プロセスが親プロセスよりも先に終了した時
リソース上残ってしまうプロセスのことでしょうか?まだよくわかってないのですが。
その観点でいうとなにか変わってきますか?

>680
最終的にはプロセスグループリーダーとなってターミナルから制御を切り離したいだけなのですが
それぞれのやり方にメリット、デメリットがあるのでしょうか?
Advanced Programming in the UNIX Environment を読みましょう。
>>677
ぐぐってみたが、daemontoolsの便利さは、daemon(3)の便利さとは別みたい
に思える。

>>681
デーモンを起動して自分はすぐ死んでしまうなら同じじゃないでしょうか?
ようは自分がwaitしないですませようという話だと思うので。
Shellが親processだと、shellがwait(2)してくれるまでzombieのまま。
Daemonが、起動したshellの振る舞い如何でzombieとして残るのは、
何か実害があるわけではなくても、好ましいことではない。
早々とinit(8)に養子縁組に出すのが良い。
子が終了したとか孫がおかしくなったとか、

ゾンビを殺せとかデーモンが死ぬとか

このスレ、いい歳こいて変な奴多すぎ。
686678:04/02/14 18:16
親プロセスが先に終了する場合は問題がないが、子プロセスが先に終了して
しまうとリソース上解放されずに残ってしまうため、親プロセスが
waitをする必要がある。ただし子プロセス生成後、すぐにデーモン化
することでゾンビプロセスの心配はない。ということでしょうか?

となると親プロセスが先に終了することが保証されている場合にのみ
1,2の方法に特別な違いはない、ということになりますか?

認識がずれていそうなので確認させてください。
>>686
1のやりかたが普通だと思ってたけど。
UNIX Programming FAQみたいなのにやりかたかいてる。
>>687
UNIX Programming FAQをぐぐってみたら、forkを2回するのは端末を
切り離すためだと書いてあった。
>>686
合ってます。
所詮、daemonを端末から起動する時の話なんで、

> リソースが解放されずに残ってしまうため

は大したことないです。

Win32なら、primitive APIのoptionを増やして対応ってところでしょうけど、
UNIXの場合、2のように、well designedなprimitiveを組み合わせてやる方法が良くとられます。
それはshell programmingでもっとも顕著です。

>>688
setsid(2)を併用するとそうです。
http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
690678:04/02/14 19:43
>>689
UNIX系OSのman等を見るとsetpgrpではなくsetsidを使うように勧告しているのですが、
理由はなぜでしょうか?setpgrpで失敗した時の動作に関して明確な定義(errnoの設定)がされて
いないからでしょうか?もしご存知なら教えてください。
昔はclose(2)やsetpgrp(2)あるいはその組合わせで、
controlling terminalの切り放しが行われるようになっていた。
そしてUNIXごとにやり方が違った。POSIXがsetsid(2)に統一した。
以上。
>>688
うわ、2回forkするのが普通だって書いてた?
もう一回読みなおすべ。
>>691に、
ioctl(fd, TIOCNOTTY, 0)を書くのを忘れた。(のを目覚めたときに気づきました)

${EMACS}/src/process.cを眺めると面白いです。
create_process()は、化石の堆積層です(w
# もちろんdaemonを起動しているんじゃないから、二回forkしてませんけども。
694678:04/02/15 15:17
>>691,693
ありがとうございます。何か色々とデーモン化の方法があるんですね。
POSIX準拠であればsetpgrpよりsetsidを用いた方がよさそうです。

また質問があるのですが、waitは任意の子プロセスの状態が変化するまで
待つそうですが、同じようにwaitpidで、指定した子プロセスの状態が変化するまで
待たせるためには、第3引数に0を指定すればよいのでしょうか?
(例えば、waitpid(pid, &status, 0)のような記述で。)
<sys/wait.h>に定義されておらず、また数値を指定するのはよくないそうなので
困っています。
>>694
何で、マニュアル見ないの ?

% man waitpid

options 引数には、以下の任意のオプションのビット論理和が入ります。
WCONTINUED オプションは、カレントプロセスの子プロセスで、ジョブ制御の停止状態から SIGCONT シグナルを受け取って復帰したプロセスのステータスも報告するべきであることを示します。
WNOHANG オプションは、ステータスを報告するプロセスがない場合に呼び出しがブロックしないことを示すために使用します。
WUNTRACED オプションを設定すると、SIGTTIN シグナル、SIGTTOU シグナル、SIGTSTP シグナル、 SIGSTOP シグナルのために停止したカレントプロセスの子にも、そのステータスを報告させます。

(FreeBSD のマニュアルだから、あんたのシステムとは異なるかもしれない。)
>>695
Linux、HPUX、Solaris等のmanは確認してはいたんですけど、
親プロセスにだけ子プロセス終了の通知をするためのオプションが
どれに当たるのか判断できなかったので聞きました。
697678:04/02/15 15:53
>>695
OSが異なった場合に定義も異なる可能性があるのでマクロ指定をすべき
とどこかに書かれていたのですが、上記のUNIX FAQや他のサイトでは
オプションに0をつけたサンプルプログラムがありました。この0指定の
動作はどこかで定義されているのでしょうか?
>>696-697
> この0指定の動作はどこかで定義されているのでしょうか?

> options 引数には、以下の任意のオプションのビット論理和が入ります。

でわからんのか ? オプションの各ビットが "Off" と言う意味だぞ。

例えば、WNOHANG なら、「ステータスを報告するプロセスがない場合に呼び出しがブロック "する" ことを示す。」
>>698
「0個以上のオプションの論理和」だから、0指定すれば、カレントプロセスが
サスペンドして、指定プロセスがexitするまで待つだけの機能になるという
ことでしょうか?
「サスペンドして」は冗長。しかもsignal状態と紛らわしい。
678は基本的な知識と素養がごっそり抜け落ちているな。
702デフォルトの名無しさん:04/02/24 17:34
このスレ名物空白期間か。
年末年始の空白はなかなかのものだった。
703アニーです。:04/02/25 11:26
CRONでSQL文に引数を以下の様に与えたいのですがうまく受け取ってくれません。
なにか良い方法はないでしょうか。どなたかご教授願います。

XX/XX/XXX.sql date "+%Y%m%d%H%M%S"
704デフォルトの名無しさん:04/02/25 11:28
sql `date "+%Y%m%d%H%M%S"`
なんじゃねーの? 続きはUNIX板のくだ質スレでね。
706デフォルトの名無しさん:04/03/04 14:29
C言語質問スレで聞いたらこちらに誘導されたので質問させてください。


Linux上でC言語を使用してサーバ―クライアント間のプログラムを作っていますが、
TCP接続でクライアント間とサーバ間で接続を行い通信を行っている途中、
クライアントのプログラムを終了した場合、サーバ側で接続が切れたかどうかを
判別する方法はないでしょうか?
ちなみにselectで待って、抜けてきたらreadを呼んでいます。
>>707
ありがとうございます!
こんばんは。助言お願い致します。m(_ _)m

C言語です。
sleep(int);
から復帰した後のキーボードバッファのクリアを
したいのですが、どうしたらいいでしょうか。

以前getcharの後にクリアしなければならなかった時は
while (s != '\n')
s = getc(stdin);
としていたのですが、sleep時では改行コードが
一つだけという保証はなく、かといって一度全部
変数に読み込んで…というのはあふれそうな気が
します。

よろしくおねがいします。

710デフォルトの名無しさん:04/03/06 00:39
あげとく
タイムアウトが起きるまで全部読め。
ノンブロッキングI/Oか、select(2)。
>>709
rewind()はどう?
>>711
selectについて検索かけましたけど
かなり深い様子…。もう少し調べてみます。

>>712
処理系によるみたいですが、僕の環境
(linux+gcc)ではfflush,rewind共に効き
ませんでした。
TTYと分かってるなら、tcsetattrとTCSAFLUSH使え。
つーかTTY以外ならflushしたらまずいと思うが。
>>714
どういう関数なのか理解するのに手間取りましたが、
無事sleepとの併用で目的の動きをしてくれるように
なりました。感謝です。m(_ _)m

また711さんにも助言をいただきましたが、
残念ながら僕には敷居が高かったようで。^^;
しかしこれからまたDOSで言うところのkbhitもどき
にも取り組むつもりなので、どっちにしろ割り込み
処理やシグナル等の知識は必要なようです。
低水準の方も徐々に勉強してみます。どうも
ありがとうございました。
起動したプログラムで自身の二重起動を判断するやり方って
どんなものがありますか?
/var/run/
lock file
>>717
調べてみます。
有難うございます。

>>718
起動時にファイルを作成するということを仰っているのかと思うの
ですが、プログラムが途中で異常終了するなど、ファイルが残って
しまうケースがあり、苦慮しています。
よく使われる定石というものはどのようなものなのでしょうか?
lock fileをlockする。
processが異常終了したらunlockされる。
Windowsではmutexを使tって判定する。
UNIXもPOSIXのmutexがあれば同じ様にできると思う。
pthreadのmutexは、process内のみで有効です。
# processを越えたmutexの拡張もありますが。
SysV IPCのsemaphoreなら、
P()して、processが異常終了した時のV()を指定できます。
>> 717 >> 718 >> 720 >> 721 >> 722 >> 723
解決できました。
有難うございました。
このスレのテンプレにAPUE買えってのを加えてもいいんじゃない?
APUEの宣伝スレではないから却下
signalについて質問です。

#define SIGUSR SIGINT
void func(int sig)
{
printf("get %d\n", SIGUSR);
}

int main()
{
(void) signal(SIGUSR, func);
sleep(5);
}

を実行して^Cとすると端末に
get 2
と表示されますが、これの1行目を
#define SIGUSR 97 //'a'は97
としても
get 97
を得ることができません。どうしたらいいでしょうか?
728727:04/03/08 07:49
追記です。
要はタイムアウト付きgetch()の動きをして欲しいのです。
#selectを使ってタイムアウト付きgetchar()同等の
#動きまではできたのですが…
>>727
97なんてシグナル番号存在しないだろう。
シグナルはOSで決められたものしか使えないよ。man 7 signal すれ。
731デフォルトの名無しさん:04/03/08 22:07
>>729
やばい、頭パンクしそうだ。根気強くやります。
サマリーかなり後かもですけどとりあえず感謝です。

>>730
OSで決められたものだけなんですか、、残念。(--;)
最初これを発見した時は
system("stty intr 97");
とやって後から元に戻すとか考えたんですけど、これでは
SIGINT返しても2で固定なんですよね(教えていただいた
今から考えれば極当たり前なんですけど)。2つのキーで
違う返り値を得たいので、とりあえずこれは諦めて
他の方法でやってみます。
>>731
二つくらいなら、SIGINTとSIGABRTでなんとかなるよ。
キーボード一発で停められなくなるけどな。
Ctrl-Zしてkillすれば殺せるが。
733デフォルトの名無しさん:04/03/10 21:12
remshで起動された自ホストのCシェルスクリプトの標準出力先。

OSはhp-ux11.0

標準出力するコマンドは単なるcdだけど、いかんせんうちのcdは
エイリアスされており、cd !*;pwdとなっており、しかもインタプリタは
環境設定ファイルを読み込むようになっている
(#!/bin/csh -fでなく、#!/bin/cshとなっている)

こういう場合って、異常終了するよね。でも、わがシステムでは
異常終了する場合としない場合とがあって、訳わからんのだわ。
というか黄身のレス、訳がわからん。
735デフォルトの名無しさん:04/03/11 17:05
LinuxのC言語でプログラムを作成しているのですが、
多重起動を抑制するにはどうすれば良いのでしょうか?
737デフォルトの名無しさん:04/03/11 17:54
/var/runっていうディレクトリのないUNIXってありますか?
あります。
圭子タンもやっぱりviはお嫌いですか?
ファイルをopenする
取得できたディスクリプタにfcntlを使ってF_SETLKする
このfcntlがNGなら二重起動と判断するんだよsutu
flockを使ってもいいけどね
741デフォルトの名無しさん:04/03/12 23:36
複数のプロセスが同一のファイルを O_APPEND で open(2) し続けている
状態で、何も考えずにひたすらデータを書き込んでいく場合、ファイルが
壊れてしまうことはないと思って良いのでしょうか? つまり write(2) の
前に、ファイルの最後尾に移動することが保証されているのかどうか、と
いうところがポイントだとは思うのですが。
>>741
ポイントも何も…。
APUEを持っているなら、3.11を読んでみるといいことあるかも。
743デフォルトの名無しさん:04/03/13 07:05
while(1){
  処理
}

この部分をスレッドとして動かして、
別の処理2を

while(1){
処理2
}
として別々に動かしつづけたいのですが、どういった命令を使えばいいのでしょうか?

OSはLinuxです。現在UNIXシステムプログラミング入門という本のfork()関数あたりを読んでいます。

int pid;
if( (oid= fork()) == 0 ) {
  子プロセスの処理
} else id(pid >=1) {
  親プロセスの処理
} else {
  エラー処理
}

とかいてあるのですが、この子プロセス、親プロセスのところに、処理1、処理2を、当てはめたらいいのでしょうか?
アドバイスお願い致します。
744デフォルトの名無しさん:04/03/13 07:06
oid > pid
id > if

です。誤字脱字があり申し訳ありません
>>743
それでいいですが、その場合スレッドとして動かすのではなくて、
プロセスとして動かすことになります。プロセスはスレッドと違い、
メモリ空間を共有しません。
pthread_t tid1;
pthread_t tid2;

pthread_create(&tid1, NUL, aaa(), NULL);
pthread_create(&tid1, NUL, bbb(), NULL);

pthread_join(tid1, NULL);
pthread_join(tid2, NULL);

void aaa(void* arg)
{
while(1)
処理1;
}

void bbb(void* arg)
{
while(1)
処理2;
}
NULはNULLの間違い
aaa()てなんだ?
きみさ、馬鹿じゃないのか?
749743:04/03/13 10:56
>745-746
ありがとうございます。
よくわかりました。

ヘッダファイル関係は、googleで調べて、把握できたので、さっそくやってみたいとおもいます。
アドバイスありがとうございます
どうやら、そうらしい
751デフォルトの名無しさん:04/03/13 22:30
UNIXプログラミングのスレでの質問で申し訳ありませんが、
Linuxで、PostgreSQLへSJISデータをEUC_JPとしてエンコードしてinsertするときは、

PQsetClientEncoding
PQclientEncoding
などの関数を使っているのですが、

普通に、printfやputs などで、表示する場合には、どのような関数を被せればいいんでしょうか?
それともnkfのソースでも拾ってきて自分で、用意するしかないんでしょうか?

愛昆布
>>751
EUC-JPなDBからSJISとしてひっぱってきたいんなら
PQsetClientEncodingでそう指定すればいいだけかと。

文字エンコーディングを変換する手法を知りたいのなら、
nkfを組み込む、iconv(3)を利用するって感じか?
754デフォルトの名無しさん:04/03/14 02:37
>>753
ありがとうございます。
DBとは関係なくエンコーディングの事を知りたかったので
iconv(3)をあたってみます。
>>754
だったらDBの話を初めからするなと
スレとは関係なく、眠たくなったので寝ようと思います。
スレ違いってことだね。

自分はUNIX大嫌いです。
早くなくなって欲しい。
>>757
禿同。こんなにプログラミングするのにまどろっこしい環境今まで知らん・・・
もうやめます。それともVineLinuxじゃなくてTurboLinuxをインスコすれば
いいのかな?
いや、おふたかたのような頭のつくりではどちらも一緒だと思いますよ。
Delphi on Linux か VB on Linuxでも出るまでWindowsの世界に逃げ戻ってるのがおすすめです。

なんだか、吉野家で牛丼が出てきたら箸とって食べればいいのに
フォーク、スプーン、ナイフが揃えられてついでにナプキンも人につけてもらうまで
じーっと待っている人のような感じですね。
UNIXは環境への依存が激しいからな。あっちのUNIXとこっちのUNIXで
全然やりかたが違ったり微妙な挙動の差異があったりする。

UNIXオタは「それはその環境が標準に準拠していないのが悪い」等、
現実無視も甚だしい、トンチンカンなことを抜かすから役に立たない。

結局、OSの種類やバージョン毎に、全く別個の環境として捉えておく
しかないと思うよ。Win98とMeと2kとXPが違うのと同じように。
(まあ、まだWin系の違いのほうがマシだが)

これが理解できないヒトはまだ初心者だろうから、まずは単一の環境で
ある程度のモノが作れるようになったほうがいいと思う。それから、
ちょっと違う環境にportしてみるといい。まあ「まどろっこしい」と
感じるだけだろうけどな。それが現実。
UNIXが、というよりCが、だろ
762デフォルトの名無しさん:04/03/21 21:50
MSのモノカルチャーとは違う
>>760
確かに、初めて Digital 使ったときは、流石にその違いにちょっとビビった
もんだけど、Windows を使うことに比べたら全然気にならなかったよ。
I/O 制御でも何でも、別に弄りたきゃ自分で弄ればいいわけだし。

単一の環境である程度のものをってのは同意するけど。普通に使える人は別に
環境がどうこうって文句言わず、対応させるでしょ。
UNIXオタが必死になって反論してるつもりになってるが
反論になってないな
Unix は難しいのを良しとする ヲタ の OS なので厨でも使える
ウイソ のような IDE は流行らない。
別に難しくないだろ
難しくはないが、>>760の言うとおり、unixだからといって同じではないな。
UNIXに対していいたいことはあるが、
そこでWindowsをもってくるのは、あまりに
ありふれてて猛秋田。
名前に惑わされるなってこった
具体的にどの辺のレイヤーを相手に愚痴ってるのかさっぱり分からん
それは経験が足りないからでは?
772デフォルトの名無しさん:04/03/22 14:01
ネットワーク障害の検出方法について質問です。
TCPIP通信のクライアント側の受信処理で、ソケットに対しread関数を使って受信データを取得しています。
read関数が失敗して-1が帰ってきたらネットワーク障害だと判定したいのですが、
ネットワーク障害の検出にread関数の戻り値を使うのが本当に正しいのかがわかりません。
ネットワーク障害の正しい検出の仕方をご存知の方教えていただけないでしょうか?
(タイムアウト判定は、select関数を使っています。)
773デフォルトの名無しさん:04/03/22 15:45
navi2chでpc,pc3の板全部が見れなくなったよ。
どうしよう。どうすればいいのか誰か教えてくれ!
774デフォルトの名無しさん:04/03/22 15:49
check file... moved
ってミニバッファに表示されて、古いスレッド一覧が
表示されるだけ。困った。
775デフォルトの名無しさん:04/03/22 15:53
ある関数が割り込みセーフかどうか知るにはどうしたらいいですか?

とりあえず関数を呼び出す前にシグナルをマスクしておけば間違いないですかね?
776デフォルトの名無しさん:04/03/22 16:06
>Q. 突然とある板が更新されなくなったみたいなんだけど。
>A. それは多分2ちゃんねる側の問題。板の移転があったのかも。
>~/.navi2ch/etc.txt を駆使するか、有志がメンテナンスしている最新の板一覧
>(◆YaAzLuckyc さんの http://azlucky.s25.xrea.com/2chboard/bbsmenu.html とか、
>http://azlucky.s25.xrea.com/ の【 他のボード一覧配布先 】にあるものとか) を
>navi2ch-list-bbstable-url に設定するといいかも。

(setq navi2ch-list-bbstable-url "http://azlucky.s25.xrea.com/2chboard/bbsmenu.html")
これでOKでした。どもお騒がせしますた。



777デフォルトの名無しさん:04/03/22 18:42
UNIXスレで777ゲット
>>775
ソースを読む。
まあスレッドセーフなら割り込まれても問題ないと思いねえ。

安易に逃げるならマスクすればいい。
>>777
俺は他人だがお前に書き込んでもいいんだな?いいんだな?
こういう奴は、どうせディレクトリも 777 だろうから rm しちまえよ。
781777:04/03/22 21:50
>>779
ああそういう意味か。
どうぞどうぞ。chmod 777 -R /もしてあるよ。
>>772
http://pc2.2ch.net/test/read.cgi/tech/1073560271/l50
-1でわかるのは、原因わからんけど読み込み失敗。以上。
errnoでもう少し詳しくわかるが、そこらへんからはOS依存。
783772:04/03/23 09:30
>>782
ありがとん。
そのスレに逝ってきまつ。
>>773
pc4に移転したよ。
785 名前:-R と言うファイル等がカレントにあればいいんだけど。[sage] 投稿日:04/03/26 00:33
>>781
> chmod 777 -R / もしてあるよ。
chmod: -R: No such file or directory



786 名前:デフォルトの名無しさん[] 投稿日:04/03/26 07:02
誰かC++でCPU使用率の取得方法を教えてください。


787 名前:デフォルトの名無しさん[sage] 投稿日:04/03/26 07:34
uptime呼んどけ


788 名前:デフォルトの名無しさん[sage] 投稿日:04/03/26 11:18
>>786
C++でっていうよりOS依存な気が。たとえばlinuxなら/proc/stat見るとかに
なるだろう。見かけはテキストファイルだから簡単に読める。

BSD系だと/dev/memや/dev/kmem開いて中を覗くことになると思う。それ
用のkvm_ほげほげって名前のライブラリがあるので使うと楽。

>>787
uptimeコマンドが表示するload averageはcpu使用率じゃないよ。
tesutu
うちのchmodは-Rをつけたら再帰的に処理してくれたけどな。
GNU chmodがどこにでもあると思うなという話?
>>788-789
お前ら 1回 man chmod するか、適当なファイルに対して chmod 777 -R xxx してみなよ。

勇気があるなら、chmod 777 -R / でもいいけど。
番号ずれてるし。話題、すれ違いだし。
791デフォルトの名無しさん:04/04/04 19:03
質問です。
#include <unistd.h>
int main(void)
{
char c;
read(0, &c, 1);
write(1, &c, 1);
return 0;
}
[foo@foo asm] ./a.out
aaaaaaaa
[foo@foo asm]$ aaaaaaa
-bash: aaaaaaa: command not found

1文字だけreadして、その後プログラムを終了するとあまった文字列が、
bashへ流れてしまいます。
□ 質問1.この解決方法なにかありませんか。
自分は、fcntlでSTDINをNONBLOCKにして、
読めるだけ読んだあと終了する方法を思いつきましたが、これでは、
その後の処理に影響が出ます。
□ 質問2.一度NONBLOCKに設定したファイルディスクリプタのNONBLOCKフラグをOFFにできませんか?
792791:04/04/04 19:15
すみません。
自己解決しました。
#include <unistd.h>
#include <fcntl.h>
int main(void)
{
char c;
char buff[128];
int flag;

flag = fcntl(0, F_GETFL);
read(0, &c, 1);
write(1, &c, 1);
fcntl(0, F_SETFL, O_NONBLOCK);
while (read(0, buff, 128) != -1);
fcntl(0, F_SETFL, flag);

return 0;
}
TCIFLUSH, TCOFLUSH, TCIOFLUSH
termios(3)
>>790
哀れだ...。
795デフォルトの名無しさん:04/04/08 04:18
readでブロックしずに読み込めるデータがあるか調べるのってどう
やってやるんでしたっけ?
ioctlでTIO???を使うってどこかで見た記憶があるのですが。
797796:04/04/08 08:43
>ioctlでTIO???を使うってどこかで見た記憶があるのですが。
これは勘違いだったような気がしてきました。

やりたいことは下のプログラムのこの部分で、
>// 子プロセス (shell) 出力 → 親プロセス標準出力 に転送
>ssize_t len = read(ufds[1].fd, buf, sizeof(buf));
子プロセスからの出力を全部読み取ったかを確認することです。

ioctlにはこだわりません。何か方法を教えてください。

http://www.hakusan.tsg.ne.jp/tjkawa/pdiary/200306.jsp
while (true) {
    ufds[0].fd = 0; ufds[1].fd = master;
    ufds[0].events = POLLIN; ufds[1].events = POLLIN;
    ufds[0].revents = 0; ufds[0].revents = 0;
    int r = poll(&ufds[0], 2, -1);
    if (r > 0) {
        if (ufds[0].revents & POLLIN) {
        // 親プロセス標準入力 → 子プロセス (shell) に転送
        ssize_t len = read(ufds[0].fd, buf, sizeof(buf));
        if (len > 0) write(ufds[1].fd, buf, len);
        } else if (ufds[0].revents) break;
        if (ufds[1].revents & POLLIN) {
        // 子プロセス (shell) 出力 → 親プロセス標準出力 に転送
        ssize_t len = read(ufds[1].fd, buf, sizeof(buf));
        if (len > 0) write(1, buf, len);
        } else if (ufds[1].revents) break;
以下略
798デフォルトの名無しさん:04/04/08 10:10
始めまして
プログラム上から他のプログラムやシェルスクリプトを実行する方法を教えてください
お願いします
799デフォルトの名無しさん:04/04/08 10:17
>>798
system
>>797
> やりたいことは下のプログラムのこの部分で、
> >// 子プロセス (shell) 出力 → 親プロセス標準出力 に転送
> >ssize_t len = read(ufds[1].fd, buf, sizeof(buf));
> 子プロセスからの出力を全部読み取ったかを確認することです。

単純にreadの戻り値が0ならend of fileでいいと思うが。ここに
来る前にpollでPOLLIN調べてるからブロックすることもないだろうし。
801798:04/04/08 10:50
>>799
systemてなんでしょうか?
今回始めてUNIX系で作るものですから (´д`;)
>>801
man 3 system
man 2 fork
man 3 exec
803802:04/04/08 11:30
訂正。
環境によって、
execは
man 2 exec
804798:04/04/08 11:50
>>802
ありがとうございます。
調べてみます。
っつーか、調べてから質問しる
806798:04/04/08 13:49
っていうか、
こういう場合の調べ方がむずかすぃので・・・
つい楽してしまいますた
thanks
>>806
調べかたが難しいなんて言っちゃっても問題がない環境に行けて幸せだね。
>>806
man -k execute
man -k command | egrep 3
809デフォルトの名無しさん:04/04/10 12:51
実行するとfloating point exception (core dumped)と出て中断されるんですけど
floating point exception (core dumped)ってどういう意味なんですか?
そのままググれ馬鹿
811デフォルトの名無しさん:04/04/10 13:13
>>809
どこかで0除算とかしているんだろう。
>>810
ぐぐったけどメッセージについての説明は見つからなかった

>>811
rand();で除算してました
>>809
お前みたいなふいんき(←何故か変換できない)を読めない浮いた香具師が、
職場にいる点がかなり例外的な状況っていう意味。
>>813
つまらないですぅ
案の定、素人丸出しの結果だったな
ああアホらしい
>>815
馬鹿必死だなw
まあ春だしな
818デフォルトの名無しさん:04/04/11 15:27
デーモンを作成しております。

コレはトラップしとけって言うシグナルについて教えて下さい。

KILL(終了処理)とTERM(終了処理)とHUP(設定再読込)位で良いんでしょうか?
>>818
> KILL(終了処理)

お前のシステムではトラップできるのか ?
>>819
できないことに気付いたので候補から外しました。
>>818
INT
822デフォルトの名無しさん:04/04/11 23:23
以前似たような質問があったな。多分上の方にあると思うが。
823デフォルトの名無しさん:04/04/11 23:27
824デフォルトの名無しさん:04/04/14 22:18
UNIX環境でmkfifoを使いパイプファイルを作成しましたが
これってパイプのサイズは指定できるんですか?
テストしてみると32kまでしか書き込めないんですが・・・
>>824
誘導されてきたっていっとかないとマルチ扱いされちゃうかも
書き込めないって・・・読み出したのか?
やったテスト全部さらせ
827デフォルトの名無しさん:04/04/15 10:13
Linux Cでプログラム組むとして、電源遮断する方法ってある?

Win32で言う、ExitWindowsEx()みたいなの
(だったかな?Win32でプログラム作ったこと無いからよくわかんねーけど)

スキルある人教えてください。
system("shutdown -x now");
829827:04/04/15 10:27
>>828
ありがとう
家帰ったらやってみる。
ふろぽ。
linuxのジョイスティックに関してここで質問すれば、
回答してくれる人が、もしかすると、いたりしますか?板違いですか?
おそらく板違い。
ジョイスティックは実装の依存が大きいので、犬板にいった方がよい。
>>831

ドライバを知らない>>832の様なアホは放っといて私が答えますよ。
835831:04/04/23 09:26
>>832
linux板ってあったんですね。すみませんでした。盲な自分に激しく鬱。。。

>>833
ガンバって読みます。有り難うございます。

>>834
有り難うございます。
デバイスドライバ(の提供するAPI?)をつかったプログラムははじめてなんで何をどうすればよいか全然分かりません。
linuxのjoystickドライバをつかって、ジョイスティックの状態やボタンのプレス、リリースの検出を行いたいんですが、上気の理由でこまっています。

デバイスファイルを開くときにブロックモードとノンブロックモードがあるようですが、どういった使いわけなのか知りたいです。

で、今はブロックモードでジョイスティックでおきたイベントを検出しようとしてます。
参考にしているプログラムでは、
whileの無限ループ内で、オープンしたファイルでディスクリプタから、js_event(JS_DATA_TYPEではない)構造体にreadで読みこんで、
この中味を調べることで、状態の検出を行っています。
いま特にわからないところは、ioctl()がわからない、というのと、
read()が遅ければバッファのようなものがいっぱいになってしまうのではないか、というのです。ioctl()は、(特にread()とくらべてのような)ものなのでしょうか。後者は、そんなことがおきるわけが無いのでデバイスドライバがどのようにデータを出力するのかがしりたいです。

このように壊滅的に何も分かってません。
836831:04/04/23 11:00
>>で、今はブロックモードでジョイスティックでおきたイベントを検出しようとしてます。
ノンブロックモードだったっぽいです。さっぱりわからない。

ブロックモードとノンブロックモード、そのものはなんとなく分かりました。
でも、何をどうブロックするのかが分かりません。

ioctl()について少しわかりました。ファイルディスクリプタはバイト単位のデータが流れて行くまたは来る出入口だと思ってたけど、いろいろ出入り出来るんですね。。。

で、やっぱり分からないのが、ジョイスティックの状態がどこにどのようなルールでたまっていくのかです。たまらないのかな。。。
ジョイスティックは普通ポーリングするだろ

ジィスティックの入力は溜まってもうれしくいないし
データの取得要求からデータ取得完了までread関数から戻ってこないモードがブロッキング。
要求だけ出して取得完了はシグナルとか別の手段で受け取るのがノンブロッキング。データ待ちの間に別の処理を行いたい場合に有効。

制御の進行をブロックするわけです。

もちろんデータは読まないとバッファにたまりいつかは破棄されるでしょう。
>要求だけ出して取得完了はシグナルとか別の手段で受け取るのがノンブロッキング
?
つまりアレだ。
パシリに「ウーロン茶買って来い」と命令して

パシリが買ってくるのを待ってるのがブロッキング
パシリが買ってくるのを待たずに吉野家で豚丼食ってるのがノンブロッキング
841839:04/04/24 02:35
すまん。言葉が足りなかった。
いつからノンブロッキングの定義が変わったのかなと…。
わしの知っているノンブロッキングとは(joy stickだからreadの場合だけでいいよね)

readで要求をした量より十分なデータがある場合、
readは正常に終了し、要求した量のデータをreadして、そのバイト数を返す。

readで要求をした量に比べて十分なデータがない場合、
readは正常に終了し、すべてのデータをreadして、readできたバイト数を返す。

readできるデータがなかった場合、
readは失敗し、errnoに適当な値がセットされる。(おそらくEAGAINかEWOULDBLOCK)

と思うのだが…。
>>838
> データの取得要求からデータ取得完了まで
> read関数から戻ってこないモードがブロッキング。

これはいい。

> 要求だけ出して取得完了はシグナルとか
> 別の手段で受け取るのがノンブロッキング。

これは非同期の説明。

データがまだ来てないなどの理由で、
データを受け取らなくても、つまり要求か完了しなくても、
呼び出しから復帰することがあるのがノンブロッキング。

>>841
> いつからノンブロッキングの定義が変わったのかなと…。

あなたが誤って理解していたんでしょう。
非同期と分離して考えられない人は多いから。
ノンブロッキングは要求の中断可能性(可能)、
非同期は結果取得の方法(別途)。
>>842
ああ、そうか。ポーリングできるようにするのがノンブロッキングか。
>>842
>呼び出しから復帰することがあるのがノンブロッキング。

確実に復帰してもらわないと困る気がするが。
>要求が完了しなくても、
>呼び出しから復帰することがあるのがノンブロッキング。
>>844
よく読め
>>845
だから要求が完了しないときに呼び出しから復帰しない場合もあったら使いにくくないか?
>>846
だから要求が完了する/しないにかかわらず復帰するんだってば

例えば数GBのファイルを読みに行ったまま呼び出しから復帰しないままだと困るだろ?
>>847
それならわかるが842はそう書いてない。
「〜することがある」はしない場合もあることを意味する。

なんかおかしいと思ったらこういうことか…
849何もおかしくない:04/04/25 00:33
A. データを受け取り復帰
B. データを受け取らず復帰(タイムアウト等)
C. エラー

Bすることがあるのがノンブロッキング。
ないのがブロッキング。
>だから要求が完了する/しないにかかわらず復帰するんだってば
はおかしくないですか?

これこそ非同期との混同じゃないですか?
非同期処理を実現するためのひとつとしてノンブロッキングな関数がある
852831:04/04/25 01:41
皆さんのおかげで、それなりにわかってきた気がします。
迷惑かけてます。アホに付き合ってくれて本当にありがとう御座います。

read()のブロック中はプロセス(?)はサスペンドしてて割り込みが入るまでCPUを食わなかったりします?

>>841氏の書いていることに誤りはあるのですか?
ここでの説明を見ていろいろ考えてみた限り誤りの個所がわかりません。申し訳ありません。
(>readが失敗し…のところはread()の説明書が無いので失敗なのか正常なのかわかりませんが。)

データが十分あったら、読み込んで正常終了。
データが十分無くても、あるだけ読み込んで正常終了(ただし、戻り値は読み込んだバイト数)。
で、
ブロッキングモードでは、データが全然無かったら、ブロック、、
ノンブロッキングモードでは、どこかのフラグを弄って正常終了(フラグを弄って以上終了ですかね?)。
間違ってます?

システムコールの本を買うことにしました。いや、今さっき注文しました。

試してみたら、私の環境では、ジョイスティックのイベントが63個までどこかでバッファされて、64個目のイベントが入るとバッファ内が全て消去されて、初期化時のイベントがバッファされて、readされるまでイベントの取得を行わないようでした。
この60個くらいのイベントは何処に保存されてるんでしょうか?デバイスドライバ内ですかね?


ジョイスティックとは少し話がずれますが、
ファイルディスクリプタに対して、あるバイトの読み込み可能なデータが存在するかどうか調べることが出来る関数(システムコール?)はありますか?

余談ですが、今は、「ttp://atrey.karlin.mff.cuni.cz/~vojtech/joystick/」で配ってる、
「joystick-1.2.15.tar.gz 」の中の「jstest.c」とかを読んで混乱したり解ったり考えたり調べたりしています。

ゆくゆくは、非同期についても知りたいと思っているので、お勧めの参考書などがありましたら、教えてください。
853831:04/04/25 02:24
何か、僕がこのスレッドを汚している気がして来た。。。


ノンブロッキングモードで、データを全く読みこめなかった場合は異常終了扱いのようですね。試してみたら「-1」が戻されていました。異常なのか。。。

多分、read()のノンブロッキングモードに限って言えば、非同期とは関係ないですよね?いや、適当に言ってるのですが。。。
select

read
>>853
> 多分、read()のノンブロッキングモードに限って言えば、
> 非同期とは関係ないですよね?

ないです。
多くUNIXの場合、aio_*(2)ってのが非同期のprimitiveです。
>>850
> >だから要求が完了する/しないにかかわらず復帰するんだってば
> はおかしくないですか?
>
> これこそ非同期との混同じゃないですか?

この言い方はおかしい。
非同期の復帰とはどういうものかそこだけに注目して、

> >だから要求が完了する/しないにかかわらず復帰するんだってば

が非同期のケースにやや適合することから、
それは非同期との混同だと言っています。

> >だから要求が完了する/しないにかかわらず復帰するんだってば

はノンブロッキングの説明として正しい。
非同期の説明としては完了したことを確認して復帰する場合がある、
と誤解する余地があるので少し適切でない。
もちろん与り知らぬところで完了している可能性がある、
そういう意味では(非同期の一側面として)正しいことは正しいのですが。

// まあ解説しても粘着されるだけなのかも知れないが…
>>856
粘着というかあんたが素直に謝れば済む話では?
858856:04/04/25 11:34
>>857
>>856==>>847と思っているということですか?
違いますよ。

ほとんどの人はどれが正しいか分かっていると思うけど、
>>850のような書き捨てレスは、初心者を惑わすから出てきただけです。
>>858
あなたはさぞ上級者サンなのですね。
その上級者さんに質問なんですがうちの環境では
ノンブロッキングでreadしたとき、バッファにコピーされた後に
返るようなんですが、実装がまずいのですか?
(readの前後にgettimeofdayで測定しました。)

あと、とあるところに
The use of the O_NONBLOCK flag has no effect if there is some data available.
って書いてあるのですが、これも間違いですか?
>>860

かかれてるとおりだろ?
何がいいたい?
自分が無知、無能だということを言いたいのでは?
質問です。Linuxでの話です。
tmpfs上のファイルをext2上にrename(2)したいのですが断られます。
こんな時、やっぱり自前でコピーだのunlinkだの書くしかないのでしょうか?
rename(2)はファイルシステムまたげないのでそういうもの。
自前でコピーしてunlinkするしかないな。ありがちなことなので
探せばライブラリあると思うけどね。perlだとFile::Copyとか。
>>847
>だから要求が完了する/しないにかかわらず復帰するんだってば
>例えば数GBのファイルを読みに行ったまま呼び出しから復帰しないままだと困るだろ?

>>860
>ノンブロッキングでreadしたとき、バッファにコピーされた後に返る
>The use of the O_NONBLOCK flag has no effect if there is some data available.
は矛盾するが…。
866863:04/04/27 14:32
>>864
ありがとうございます。やっぱりそうですね。
しゅぱっと書きます。
>>865
処理が返らない、とはどこにも書いてないと思うが。
どの辺が矛盾してるの?
868デフォルトの名無しさん:04/04/28 00:01
対話型のコマンドをプログラムから使用しようとしています。
表示されるメッセージによって入力を変えたいのですが、あるプロセスの標準入出力を取得できるpopenの用な関数は無いでしょうか?

環境はlinux2.4.17です。
fork(2)とpipe(2)とexec*(2or3)の組み合わせ。
pipeのsample programをgoogleしてちょ。

んなことはないと思うけど、
curses使っているようなヤツなら、libexpectね。
>>869
お返事ありがとうございます。調べてみます。

やりたいことはカーネルのmake configでパラメータを自動入力したいのです。
menuconfigじゃないのでcursesは抜きですね。
871デフォルトの名無しさん:04/04/28 00:12
それって.configを書き出した方が早いのでは。
[Y/n/m]な項目だけステータスをいじりたいんです。
.configだとどれがそうなのかって判断しづらいので。
873あぼーん:あぼーん
あぼーん
>>872
そんな目的ならexpect(1)を使いなよ。
man, sample見て、すぐに書けるよ。
   . :::';;;;: . .     ..,,,;;:
   . . :;;;;;:.:;;,,    ..:.;;;;.:
   :;;'''  .:';;; . .  .:.:;;;;;':. . .        .,,,,;,,...,,
      .:;;;' :   .:;;;;; .: ,,,;;;,,,   ,  .:;;;';;''' ''';;;;,,
     . :.;;;;' . .:   ;;;;;;;;'''' ';;;:.:.. ,;: . .    ''''''"
     ';;:;'     '''';   .:.';;;;,,;;.
                 '''  ,.:.:';;;;,,,,
             ,、―-、    .;.';:;.:.: ;;;;;;:.;.;...
   -、_      (_二ニ=っ,、;;;:.:;.:;...:.:...'''''''''''
     `‐-、_  (  ´∀)f、 `''、:..:.:. .:
         `-,ノ   つ; /
         (〇  〈-`'"
         (_,ゝ  ) `‐-、_
           (__)     `'‐-、,_..
                        `‐-、._
先生、質問!

例えば、上にあるようにノンブロックモードでread()して、
データが何も無かったために、errnoに「無かった」ことを示す値がセットされたとする。
errnoを調べる前に、
もう一度read()を実行したら、読み込みたいだけ読み込むことが出来た。
このときerrnoは、「無かった」ことを示す値がセットされているのか、
「全く正常に終了した」ということを示す値がセットされてるのか知りたいです。
read()に限らずerrnoを使用する関数全てについて、それらがerrnoの使用について一定の決まりに従っているのがが激しく知りたいです。

よろしくお願いします。
>>876
当然正常。
getopt()について聞きたいんですが、これってUNIXでは標準の関数なんですか?
というかunistdに書いてあるような関数はUNIXでは標準なんですか?

getopt()の内容についてなんですが、
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/getopt.3.html
では、
「必要な引き数が足りないオプションがあると `:' を返す。」
と書いてあるんですが、
僕の環境では、未知のオプションに対する扱いと同じ「?」が帰ってきてしまいます。
例;
 hoge = getopt( argc, argv, "ab:" )
 を使って
 ./a.out -a -b
 とすると、bはオプションが引数を取る指定なので、
 「足りない」ために「:」がhogeに入るはずなんですが、
 実際には「?」が入ってしまいます。
cygwinを使ってます。何処が悪くて説明と矛盾した結果が出ているのか知りたいです。
上のサイトの説明?cygwin上の実装時の問題か何か?

お願いします。
>>878
細かな実装はライブラリに依存する。
Windowsでもバージョンによって微妙なふるまいは違うだろ。

で、君の見ているmanはLinux(newlib)のもの。
使ってるライブラリはcygwin(おそらくwinsup module)のもの。

それぞれそういう仕様であって、何も問題はない。
> ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/getopt.3.html
> では、
> 「必要な引き数が足りないオプションがあると `:' を返す。」
> と書いてあるんですが、

その訳が間違っています。
そのページの前の方にもあるように、(':'で始まらないはずの)optstringが':'
で始まってしまう場合に':'を返すわけです。

こういう説明が既に出ているにもかかわらずこのような誤訳をするというのは
整合性に注意を払っていないというか、訳している本人が理解していないというか……
>>879
そんなのが許されたらPOSIX互換が聞いて呆れませんか?
その関数に関してはPOSIXの設計にバグがあったと記憶してますが。
880氏の指摘
>そのページの前の方にもあるように、(':'で始まらないはずの)optstringが':'で始まってしまう場合に':'を返すわけです。
を見て文章を読み直したら、私の読解の問題だと気付きました。

通常(optstringが':'で始まっていない場合)は、
オプション引数が足りないときには、
想定外のオプションが指定された場合と同様に'?'を返す。
で、
しかし、もしも、optstringが':'で始まっていた場合は、
オプション引数が足りないときには、
'?'ではなく':'を返すといっているのですね。

読解のミスと、プログラミングのミスが重なって混乱していたようです。ご迷惑をかけました。

':'を返したいなら、例は
> hoge = getopt( argc, argv, "ab:" )
ではなくて
 hoge = getopt( argc, argv, ":ab:" )
のようにする必要がありましたね。

いや、申し訳ありません。解決しました。国語能力が足りてないか…ゴフッ
883デフォルトの名無しさん:04/05/01 06:25
話を蒸しかえして申し訳ないです. ブロッキング/ノンブロッキング,
同期/非同期に関して, 以下の説明ってあってますか ?
私のイメージとしては, こんな感じなのですが.
特に, 何をもって同期/非同期というのか, あまり理解してないです.
>>842 の説明とも違っているみたいですし...

ブロッキング処理: 要求が完了(正常終了/異常終了)するまで制御が返ってこない処理.
ノンブロッキング処理: 要求完了, または要求の処理途中にも制御が返ってくる処理.

(例えば) 2 つの関連する処理 A, B に関して,
同期処理: 処理 A の完了を待って, 処理 B を実行すること.
非同期処理: 処理 A の完了を待たずに, 処理 B を実行すること.
>>883
ブロッキング:パン屋に行ってパンがなければ一生待ち続けるバカ。
ノンブロッキング:パン屋に行ってパンが無ければ何も買わずにさっさと帰ってくる気の利かないバカ。

同期:お使いを頼むと取りあえずは何も考えずパン屋まで行って何かをして帰ってくる。
非同期:お使いを頼むとパンの焼き上がりを電話してくれるように頼む割と頭の良い子。
      しかし、やりようによっては、
 
      「先に金を出せ!そうしたらパンをくれてやる!!」
> ノンブロッキング:パン屋に行ってパンが無ければ何も買わずにさっさと帰ってくる気の利かないバカ。

頼まれた個数に足りない場合は、あるだけ買って帰ってくるから
少しはマシかもしれない。

でも「足りないじゃないの!何やってんの!もういちどいってらっしゃい!」
と怒られることがほとんど
非同期は1つじゃないことにいい加減気付け。
まずカーネルのデバイスからの読み出しはプロセスから見て普通非同期。
通常ファイルなら最初のread()まで読み出しは行われないだろうが、
それ以外の大抵のデバイスは、カーネルにどんどんデータを送って来て、
カーネルがそれをバッファに溜めている。
次に、プロセスのカーネルからの読み出しは、read()を使う限り
常に同期的に行われる。aio_read()の場合は非同期。
最後に、O_ASYNCを使う場合は、read()自体は同期的だが、プロセスの
SIGIOハンドラは通常のプロセスの実行コンテキストから見て非同期に走る。
>>886
いい加減モナにもその辺の議論は数日前に終わっている。
888デフォルトの名無しさん:04/05/03 17:21
>877
正常終了の場合に errno ってセットされたっけ?
されなかったような気がするんだが

もしされるんだとするなら errno の正常終了を意味する値って何?
マニュアルにも載ってないぞ
889デフォルトの名無しさん:04/05/03 17:32
正常終了のときはerrnoの値は変更されないぞ。
0にしたいなら呼ぶ前に入れておく。
890デフォルトの名無しさん:04/05/03 18:20
:::::::::::/           ヽ::::::::::::
:::::::::::|  必   じ  き  i::::::::::::
:::::::::::.ゝ 死   つ   み  ノ:::::::::::
:::::::::::/  だ  に  は イ:::::::::::::
:::::  |  な。       ゙i  ::::::
   \_         ,,-'
――--、..,ヽ__  _,,-''
:::::::,-‐、,‐、ヽ. )ノ      _,,...-
:::::_|/ 。|。ヽ|-i、      ∠_:::::::::
/. ` ' ● ' ニ 、     ,-、ヽ|:::::::::
ニ __l___ノ     |・ | |, -、::
/ ̄ _  | i     ゚r ー'  6 |::
|( ̄`'  )/ / ,..    i     '-
`ー---―' / '(__ )   ヽ 、
====( i)==::::/      ,/ニニニ
:/     ヽ:::i       /;;;;;;;;;;;;;;;;

>>888
> もしされるんだとするなら errno の正常終了を意味する値って何?
> マニュアルにも載ってないぞ

普通0なんだが、正常終了時に設定はされないし、使っちゃダメだな。
正常か異常かは(ほとんどの場合)返り値で判断する。
# glibcだと printf("%d, %s\n", errno, strerror(errno)); で
# 0, Success でした。

それはともかく、errnoって初心者を困惑させるもとだよね。
herrnoとかgai_strerrorとか、(他にもある?)
libcの開発に加わっていない連中の書いたライブラリとの統一性とか。
いわゆるバッドノウハウですな。
単にチュートリアルが少ないだけの話かもしれんけど。
893デフォルトの名無しさん:04/05/05 22:16
coreutilsのソースコードを読み始めました。
最初にbasenameから読んだんですが、lib/basename.cにある、
size_t base_len (char const *name)
{
size_t len;

for (len = strlen (name); 1 < len && ISSLASH (name[len - 1]); len--)
continue;

return len;
}
という関数がsrc/basename.cで
name[ base_len(name) ] = '\0';
と呼び出されています。size_tがいまいち理解できてないんですが、
この配列(name)の添字となる関数やその内部の変数には何故intを使わずにsize_tを使っているんでしょうか。
説明下手クソでごめんなさい。ソースもどういう範囲でコピペしたらいいのかわからなくて。
いまいち厨キター!(AA略

>何故intを使わずにsize_tを使っているんでしょうか。
size_t は unsigned 整数だ。
あとは自分で考えるべし。
895デフォルトの名無しさん:04/05/05 23:42
「スクリプトファイルの先頭の、 #! で始まるインタープリターの指定行」に名称ってありますか?
shbang
>>893
サイズを扱う型と言うことで整数型と区別します。
size_tって整数型だろ。

処理系のint, long, long longのbit幅に依存しない型になってる訳だろ。
sizeof(size_t) == sizeof(int)とは限らんからな。
文字列の比較でワイルドカード(*、?)を使いたいのですが、
良いアルゴリズム及びサンプルプログラムがありましたら教えて頂きたいのですが・・・
ご教授よろしくお願いします。
900899:04/05/06 16:25
追記:言語はCです。
>>899
fnmatch(3)
オートマトンで具ぐれ
>>901
こんなのあったのか。
regexecで作っちまってた。
ぐええ。
904デフォルトの名無しさん:04/05/09 23:05
メッセージキューについて質問です。

複数のプロセスからメッセージキューに書き込みを行いたいと思っています。
その場合、同時にキューにアクセスしてしまう可能性があると思うのですが、
排他制御は必要なのでしょうか。
唐突な質問ですがよろしくお願います。
どのOSのどのAPI?
906デフォルトの名無しさん:04/05/09 23:13
907904:04/05/09 23:29
OSはHP-UXで、cで書く予定です。
どのAPI?ipcってことでしょうか?
ipcのメッセージキューならそう書けばいいんじゃなかろうか
909904:04/05/10 00:17
やっぱり排他制御必要ですか・・・
書き込みの順番も勝手にキューイングしてくれるもんかと思ってました
素人ですみません
System V IPC のメッセージキューだよね。あれって OS 側で排他制御
してくれないんだっけ?
するよ。MT-Safeとは書いてないけど。
912デフォルトの名無しさん:04/05/10 21:57
setlocale(LC_ALL,"ja");

setlocale(LC_ALL,"");
はどう違うんでしょうか?どちらも同じ結果になり、コメントアウトするとうまく動きません。
setlocale(LC_ALL,"");
とすると、標準のロケールが選択されると考えていいのでしょうか?
913デフォルトの名無しさん:04/05/11 01:36
BSD入門の心得 1.0.9

・質問は霞ヶ関でも通用するような完璧な形式に。
・過去ログは紀元前までさかのぼって完全に調べる事。
・新機能ができても細部にこだわってできるだけリリースしない。
・「正しい」か「誤っている」かを結論づけないと気が済まない性格になる事。
・質問自体は無視して語句の間違いの指摘に熱中する事。
・初心者を見たらできる限り冷酷に排除。
・回答は1行以内で簡潔に。 例:man hoge
・古いバージョンを使っていることがわかると最新にしろという。
・一日三回食後必ずLinuxをあざ笑う事。
・自分の状態に「自覚症状」を持たないこと。
・ウインドウズはエロゲに限ってやむを得ず。
・MacOSXは邪悪なBSD。
・板違いの質問をしたLinuxerを徹底的に叩く事。
・forkする時はアニメ絡みの名前をつける事。
・MLで気に入らない投稿が流れてきたらメールアドレスも含めて全文コピペ
・意味もなく全角英数字を使うやつは小一時間問い詰める事。
・実際より大きく万能である事を見せるために*BSDと表記する事。
・FreeBSD, NetBSD, OpenBSDと正しく表記しない奴はこの世から抹殺する事。
BSD++ == BSE ですか?
関わると脳が破壊されます > BSD(++)
forkって子プロセスに名前って付けられるんですか?
あるプログラムAから、別のプログラムBを実行させて(system()とかかなぁ?)、
きちんと起動したが確認して(戻り値の確認とかで出来たりしないだろうか?)、
終了せよとの合図無しに終了したらそれを確認して、
必要なくなったら終了させて、
きちんと終了したか確認する方法にはどんなものがあるでしょうか?

上記のことで特に、javaからcを実行させるとか出来ますか?(javaに限らず知りたいです)
>>917
・質問は霞ヶ関でも通用するような完璧な形式に。
>>917
forkとexecとwait
>>918は日本語の読解力と理解力に乏しい。
>>919
後SIGCHLDな
この際exit(2)も入れとけや
ついでにdup2もヨロシク♪
924デフォルトの名無しさん:04/05/13 15:56
headの逆で最初のn行目をすっ飛ばして表示するコマンドってあります?
>>924
head ←→ tail
>>925
tailは意味違うし
>>926
いやtail +nでいいと思うが。ただしn行とばしではなくてn行目から表示
なのでn行とばしたければ-1すべし。
928ごるごるもあ ◆753Z/RLFiY :04/05/13 20:08
どんどん逮捕すりゃあいいさー。
929デフォルトの名無しさん:04/05/13 20:14
>>924
UNIX板で聞けよ。
WinでもUNIXでもコンパイルするだけで動くGUIプログラムを作ろう
と思っているのですが、実現できるものなのでしょうか?

Fox Tool Kitを利用する予定です。
できるだろ
>>934
日本語入力不可ですが
933デフォルトの名無しさん:04/05/13 20:36
↓日本語入力不可なものどぞー
州*‘ o‘リ <あばばばばばばばばば
>>934
結構使いやすいよな。愛用してるよ。
>>930
てめーFOXのドキュメント読んだ上での発言か?カスがっ
>>930
http://www.widestudio.org/index.html

とりあえずコレ使っとけ。
>>930
日本語入力もってことになるとwxWidgetかtkくらいしかないんじゃないか?
gtk+の調子はどうなのかな?
gimpはなんとなく動き始めているようですが…
940デフォルトの名無しさん:04/05/19 00:59
ファイルディスクリプタを消費させて、簡単にリソースの上限値を
超えるようなループ処理を教えてもらえませんか?
ちなみに環境はSolaris8で言語はC言語です。
941デフォルトの名無しさん:04/05/19 01:01
openくり返せばいいだけでわ。
>>941
こんな感じですか?
#include <sys/resource.h>

int i;
struct rlimit *rlim;
int max_fd = getrlimit(RLIMIT_NOFILE, rlim);
for(i = 0; i < max_fd; i++){
  open(どこか, O_RDONLY);
}
943デフォルトの名無しさん:04/05/19 03:50
OSはLinuxです。
pthread_createしたスレッド内で setitimerした場合、時間が来て登録した
関数が割り込みますが、その割り込みは、setitimerしたスレッドが割り込まれる
のでしょうか?
>>943
例えばSIGTERMが特定のスレッドしか止められなかったら困りませんか?
実際はどうなるか知らんけど。
>>943
Linuxのversionによって違います。
古いのは、

> その割り込みは、setitimerしたスレッドが割り込まれるのでしょうか?

YESです。

新しいのはNOです。(こちらがpthreadの仕様)

POSIX realtime拡張の入っているSolarisはどちらもOK。
Linuxもpatchが出ている模様。

一般的には、他のthreadではpthread_sigmaskでblockします。
Linux onlyなら、Linux版のpthreadスレがいいと思います。
あ、setitimer(2)類似system callで
threadが指定できたかどうかは良く覚えてないや、Solaris。
とりあえずすべてのシグナルをブロックして
シグナル受信専用スレッドを作ってsigwait
>時間が来て登録した関数が割り込みますが
とあるから,signal handler使ってるんじゃねーの?

で,どのthreadにhandlerがdispatchされるのか聞いてるものと感じたが。
だから、規格上どのthreadにdispatchされるか決まってません。
ただしpthread_sigmaskでblockしているthreadにはdispatchされません。
950948:04/05/20 18:06
ん? 漏れは
>>949==>>945(?)の書き込みで十分だろ,と思って,
特に書き込まなかったわけだが。

で,そこに来た >>947 のちょいとズレたレスに突っ込みを…
951949:04/05/20 21:27
>>950
そうか…良くワカランが、良く分かった。
952まだRH9:04/05/23 15:30
Mac の CD-ROM の partition map の件ですが、Mac の人は CD burner を使うだけで
こと足りるので、聞いても分かる人がないようなので、ぐぐってみたら、unix 関係で
プログラムで引っかかるので、聞きに来ました。
(Inside Macintosh の SCSI Manager, Start Manager はありきたりの記述)
Mac の CD-ROM の先頭には、いわば device 用の諸元が入りますが、そのひとつに
全体容量をブロックサイズ(あるいはセクタサイズ)で割った数が入るところが
あります。で、この数がゼロのものと、丁寧に計算しているものがあります。
2−3の例から、読みこみ時には最早参照されていない感じがしますが、実情はどうか
ご存知の方はいらっしゃいませんか。
(2,3の Mac の CD-ROM も見ましたが、いろいろで、気持ちが悪いのです)
>>952
> Mac の CD-ROM の先頭には、

というのは一体?
954まだRH9:04/05/24 01:05
>>953
どうも。
構造体名:Block0 は次ぎのように始まっています。
"ER"の signature
unsigned short sbBlkSize  // 512 or 2048 (bytes) がよくある
unsigned long sbBlkCount // これが問題の Blk 数
....
driver 数
driver 開始 Blk で始まる8バイトのデータが繰り返される。
....
次ぎの Blk といっても、sbBlkSize=2048 でも 512 bytes 後ですが、
partition map が(512 bytes 毎に)続きます。
....
driver routine ...
955デフォルトの名無しさん:04/05/24 14:11
unixを使ったcプログラミングで、

if( fork() == 0){
/* 子プロセス */
execlp("ls", "ls", "-lag", NULL);
}

/* 親プロセス */
printf("done\n");
exit(0);

unixでこういうプログラムを実行したら、
doneが表示されて
lsの実行結果が表示されて
そのあと見えないプロンプト(?)が存在するようになるんですけど
これはどういうことなんですか?
>>955
見えないプロンプトの存在をどうやって知ったのだ!?

おいといて。
シェルに戻ってプロンプトが表示された後で
ls が実行されてるんでそ。
こんな感じですか?

pid_t ret;
if ((ret = fork()) == 0) {
execlp("ping", "ping", "-c", "3", "localhost", NULL);
} else if (ret > 0) {
wait(NULL);
printf("done\n");
} else {
perror("fork");
exit(1);
}
>>954
最近はtapeみたいにon the flyで書き込んでいくから、
正直分かりませんってとこなんじゃないの?
CD-ROMは辿っていけば分かるしね。
959まだRH9:04/05/24 23:26
>>958
レスをありがとうございます。
Apple_Free は、見ないってのは、あったのですが、
Apple_HFS もブロック数はどうでもよくなっている見たいで、
やはり、そういう流れでしょうか。
UNIX のソースにも、/* XXX */ ってコメントが付いている。
coreってどうやってデバックすればいいの?
$ gdb a.out core
962デフォルトの名無しさん:04/05/26 09:18
>>961
いやそれは分かるんだけど、そのあとどうすればよいのか分からない。
(gdb) where
Debugging with GDB
http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gdb-5.0/gdb-ja_toc.html

backtraceして止まった辺りを調べるとか。
実例入力
(gdb) bt
(gdb) f
(gdb) list
(gdb) print var
(gdb) printf "%08x",var
(gdb) up
(gdb) list
(gdb) list 20
(gdb) down
>>965
それだとupの時点でlistの効力が切れるから次ターンでcontの反撃を食うことになるぞ。
GUIフロントエンド使えって
俺はemacsで使う
>>968
readline使えなくて地獄じゃないですか?
使えるよ。
でもちょっと変数を見たいだけなら fprintf が手っ取り早いんだな。
Emacsのフロントエンドって時々おかしくなるので困る。
コマンドラインのgdbで実行すると正しく動くのに、
Emacs上のgdbフロントエンドからだとステップ実行の行がおかしかったり
落ちてしまったりするんだよな。なぜだろう。

DDDは日本語を含むファイルで位置の計算が合わないし、どこかにフロントエンドはないものか。
973デフォルトの名無しさん:04/05/28 15:30
OutputDebugStringみたいなのってないですか?
syslogじゃなくて。
>>973
どーゆー機能が欲しいかも書かず
「みたいなの」じゃ判らん。
fprintf(stderr, 〜 じゃ駄目なのか?
975デフォルトの名無しさん:04/05/28 16:21
linuxで書いたネットワーク関係のライブラリを
カーネルモジュールにして欲しい、って言われますた。
仮想ネットワークドライバにしようと思うんだけど、移植って簡単にできるの?
mallocとかしてるとこを全部kmallocに書き換えないといけないくらい?
あとlibsslとかの普通のアプリケーション用ライブラリってカーネルモジュールに使えるの?
976デフォルトの名無しさん:04/05/28 16:30
>> 975
一般的にカーネルモードで動作するロジック中で、
システムコールやライブラリ関数を使う事は出来ません。
つまり、マニュアルセクションの2と3は使えないってこと。
使用可能な関数は、セクション9になります。

また、ユーザーランドのプログラミングとカーネル内部の
プログラミングでは、プログラミングを行うときの考え方や
気をつけないと行けない事、その他もろもろ、など全く異なる
概念でもってプログラムを作成しなければいけません。

よって、移植というレベルではありません。
2.6で激しく変わったんじゃなかったかなあ>NW周り
978975:04/05/28 16:45
>>976
ってことはかなり書き換えですか・・・。

tron用にも書いて欲しい、とか言われたので
カーネルモジュールにしようと思ったんですが、
とりあえずtun/tapを使う方向で考え直してみます。
ありがとうございます。

>>977
2.4をターゲットにするんでそこは大丈夫そうです。
ソケット通信時にrecvfromでデータを受信してるんですけど確実に第3引数で指定した
サイズを受信するまで待つようにするにはどうすればいいでしょうか
>>979
そんな機能はない。
ループ組んでバッファへのポインタずらしてやれば。
981デフォルトの名無しさん:04/05/29 23:32
locale 調べるのって LANG 見ればいいの?それとも LC_ALL?
982デフォルトの名無しさん:04/05/29 23:42
>>981
両方
>>981
優先順位は
LC_ALL > 他のLC_* > LANG
984981:04/05/29 23:49
>>982
どうもありがとう。
985981:04/05/29 23:50
>>983
ありがとう、よくわかりました。
986デフォルトの名無しさん:04/05/30 00:39
>>979
recvfrom ってことはUDPだよね。
UDPてことはsend もしくは、sendtoで送った1つのパケットが
そのまま受け取れるんじゃないの?
recvfromで指定するサイズって送信側とネゴしておいた値を
使うものじゃないの?
だから、なんでrecvfromで指定したサイズが受け取れないという
ケースがあるの?

TCPと勘違いしてない?
>>986
recvfromするサイズがsendtoで投げたサイズより小さい場合とかはどうなるんですか?
>>986
>UDPてことはsend もしくは、sendtoで送った1つのパケットが
途中でフラグメント化したりしないんですか?後、IPパケットが複数になってどっちかが遅延したりとか。
989デフォルトの名無しさん:04/05/30 01:57
OS起動時に呼び出されるrcスクリプトに関して質問です。
このrcスクリプトから呼ばれる各種アプリケーションの起動スクリプト内で、
コマンドを実行するときに'&'を付けてバックグラウンド実行されている
ものを見たことがないです。'&'を付けないで実行する理由は何でしょうか?
なんかわけわからん質問かも知れませんが、わかる方いたら教えてください。
>>989
シェルスクリプト終了時にコマンドがすべて完了している事が保証されなくなるから。

とか。

例えるなら、

「納期は今日だ!しかしテストは現在進行中だ!
まぁ、客もすぐここの試験をやるなんて言わんだろう・・・多分・・・。
よし!なんとかなる!客には終わったって言うぞ!!」

なんて言うアグレッシブな状況になると、思いました。

非同期処理で必ずつきまとうタイミングの問題をわざわざ持ち込む必要もなければメリットもない
と言うことかなと(結局の所変な待ちが無ければ処理時間は大して変わらんので。)。




>>988
何のためのマルチレイヤだ?
それらは,IP層で全て吸収される。

>>987
尻切れで後ろは切り捨て。これが基本。
実装次第では,オプション等でどうにかできる可能性もあるが,
そんなもんに期待してはいけない。
992デフォルトの名無しさん:04/05/30 14:16
>>990
ありがとうございます。自分は入社2年目ですが、1年目のときに
知らなかったせいでそれをやらかしてしまったのです。
HP-UXでrcスクリプトが先に終了するとSIGHUPが飛んできて、バックグラウンド
実行中のプロセスが消えました。しかし不思議なことにSolaris、AIX、Linuxでは
発生しないのです。そのあたりはOSの仕様だと勝手に自分を納得させていますが、
nohupというコマンドで最終的に切り抜けたことに不安があります。
993デフォルトの名無しさん:04/05/30 16:11
>>987
>>988

>>991 の言うとおり。
フラグメントかされたパケットは、きちんと元通りにされてアプリに
渡されます。

TCPでデータをsendしたときに、sendしたサイズ分が1回のrecvで受け取れるわけ
ではないというのと混同してないか?
>>992
私も二年目です。

HP-UXベースのリアルタイムOSを使ってます。
おもしろそうだから実験してみよっと。
995デフォルトの名無しさん:04/05/30 23:22
alarm()等から送られるシグナルを受け取るハンドラは、送ったスレッドと同じスレッドで実行されるのでしょうか?
つーかいいかげん、そろそろ次スレ立てろや、次の奴↓
↑ちょっと待っていろ。
998デフォルトの名無しさん:04/05/31 00:42
999デフォルトの名無しさん:04/05/31 00:56
【ビギナ】初心者が習うべき言語は? part4【必読】
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。