UNIXプログラミング質問すれ Part8at TECH
UNIXプログラミング質問すれ Part8 - 暇つぶし2ch552:デフォルトの名無しさん
07/01/22 15:32:42
納品するシステムのコンパイル時に、単純にコピーされるのを防止するため
ハードウェアIDなどを組み込んでコンパイルしたいのですが、
ハードウェア依存で、できるだけ高速で取得でき、
、呼び出し時間の短いシステムコールなどはありますでしょうか?

553:デフォルトの名無しさん
07/01/22 18:28:00
>>552
激しく環境依存なので OS 次第じゃないかな。
dmesg とか sysctl とかの出力は使えそうですか?


554:デフォルトの名無しさん
07/01/22 18:49:07
HDのmbrのシリアル番号を見ているソフトがある
他にはNICのMACアドレスとか
替えられない訳じゃないけど

555:デフォルトの名無しさん
07/01/22 19:23:27
>>552
機械の故障でユーザが代替品を使用せざるを得ない場合などに備えて、
マシン側で変更できるものが望ましい。
たとえばNICのMACアドレスなんかはそれを見てるものが昔からあるので
ほとんどのもので変更可能になっている。

556:デフォルトの名無しさん
07/01/22 19:38:59
コピー防止だけどそのレベルで大丈夫?

557:デフォルトの名無しさん
07/01/22 20:16:09
ドングルでもつけてioctlで叩けば~

558:デフォルトの名無しさん
07/01/22 21:44:19
>>553-557
どうもありがとうございます。
システムが飛んだら再コンパイル必須の使い切りシステムなので、HDDのmbrから調べてみます。

559:デフォルトの名無しさん
07/01/22 21:46:18
ディスクまるごとコピーするツールがあるけど大丈夫?

560:デフォルトの名無しさん
07/01/22 21:50:51
>>559
まずいです
通常は変更不能のものってありますか?

561:デフォルトの名無しさん
07/01/22 21:54:00
CPUID

562:デフォルトの名無しさん
07/01/23 00:18:55
>>560
そこまで厳密に制限したいのであれば、ハードウェアの
色々な情報をまとめて md5 してみるとかどうでしょう?
もちろん md5 の値をさらに可逆の暗号処理すると良いですね。


563:デフォルトの名無しさん
07/01/23 00:44:37
md5sumで十分でしょ。

cat /proc/cpuinfo とか
lspci -vs 00:00.0 とか

そんなのをmd5sumすれば?


564:562
07/01/23 01:35:14
まぁ md5 で十分とは思うのですが、strings(1) とかを使うと
色々と漏れちゃうので、ちょっとした計算式でシフトできたりすると
良いかなぁと思ったのです。気にしすぎかな?


565:デフォルトの名無しさん
07/01/23 02:45:20
そのくらいしたほうがいいと思います

566:デフォルトの名無しさん
07/01/23 04:22:37
MD5をわざわざ文字列にしたりしなけりゃ、少なくともstringsで出てきたりはしないと思うんだけど。

567:551
07/01/23 06:07:52
自己解決しました。

#include <sys/quota.h> の前に
#define _LINUX_QUOTA_VERSION 2 を付けてやればOKでした。

568:デフォルトの名無しさん
07/01/23 07:32:24
>>562
もしLAN常時接続が可能ならサーバー側にDB用意して
アクティベーションしないと使えないようにするとか

569:デフォルトの名無しさん
07/01/23 08:27:05
つ[LisenceManager]

570:デフォルトの名無しさん
07/02/04 17:49:07
execl()と、execlp()の違いを教えてください。
初心者ですまそ

571:デフォルトの名無しさん
07/02/04 17:55:13
URLリンク(www.linux.or.jp)

URLリンク(www.paw.hi-ho.ne.jp)


572:デフォルトの名無しさん
07/02/04 17:55:19
p付はPATHから探してくれる。


573:デフォルトの名無しさん
07/02/04 17:55:24
>>570
pがつくかつかないか。つまり、path探索をするかしないか。

574:570
07/02/04 17:58:16
>>572
>>573
つまり、pが付いたらコマンドライン引数だけでいいってことでしょうか?

575:デフォルトの名無しさん
07/02/04 18:02:37
第1引数をフルパスで書く必要があるか、PATHにあるから名前だけでいいか、
てこと。


576:570
07/02/04 18:04:19
>>575
なるほど~分かりました。
ありがとうございます

577:デフォルトの名無しさん
07/02/04 18:27:35
おまえら優しいな

578:デフォルトの名無しさん
07/02/07 18:16:19
gcc(g++)にはVC++におけるReleaseビルドとDebugビルドのような概念はないんでしょうか?

579:デフォルトの名無しさん
07/02/07 18:25:52
VC++のリリースビルドとデバッグビルドの違いを理解してからおいで。


580:デフォルトの名無しさん
07/02/07 18:26:41
オプションに-O2(とかそのほか最適化オプション)つければReleaseビルド。

581:デフォルトの名無しさん
07/02/07 18:29:04
デバッグ/リリースごとの条件コンパイルのためのプリプロセッサ
シンボルもあるだろうね。
あと、-gオプション。


582:デフォルトの名無しさん
07/02/07 19:09:40
最近のVCはReleaseでもデバッグ情報ついてるよ。

583:578
07/02/07 20:53:56
ありがとうございました!

584:デフォルトの名無しさん
07/02/07 22:37:33
sspとか

585:デフォルトの名無しさん
07/02/09 05:26:16
セッションを大量に張るアプリケーションのソケットの処理にAIOを使うってのはどうなんでしょう?
スレッドベースのハンドラを使うとたくさんのソケットがある分スレッド生成にコストがかかりそうですし
シグナルベースよりはepoll()やkqueue()の方が効率的なのかなーと思ってはいるんですが
最近AIOに興味を持ってこんなことを妄想してたんですが皆さんはどう思われます?

586:デフォルトの名無しさん
07/02/09 20:31:47
aioってkqueueで待てた気がするけど。

587:デフォルトの名無しさん
07/02/10 05:05:17
確かにEVFILT_AIOってのがありますねぇ。
便利でいいなぁ。Linuxにもこんなシステムコールあればいいのに。

588:538
07/02/10 07:00:49
>>539-550
アドバイスありがとうございます。
特に、マウントするというやり方は、当方まったく気がつきませんでした。
いろんなご意見いただいてありがたかったです。

今後も効率いい作業方法を意識していろいろtryしてみます

589:デフォルトの名無しさん
07/02/15 06:14:56
どうもaio_read()呼ぶと内部でpthread_create()が呼ばれてる感じ
スタック使い切って死にそうなので大量のセッション管理には向かないのかな

590:デフォルトの名無しさん
07/02/15 08:06:43
内部で、て……。aio_readはシステムコールだぞ。
なんでユーザプロセスのスレッドなんか生成しなきゃならん。

591:デフォルトの名無しさん
07/02/16 16:07:36
>>589
それはWin9xのWinsock2-overlappedI/O実装

592:デフォルトの名無しさん
07/02/20 00:48:16
fifo と unix ドメインソケット、どう使い分けたらいいのかを教えてください。

593:デフォルトの名無しさん
07/02/20 01:30:34
fifoは親子関係のないプロセス間で使うのに便利

594:デフォルトの名無しさん
07/02/20 01:53:08
unixドメインソケットも親子関係のないプロセスで使うと便利!

595:デフォルトの名無しさん
07/02/20 15:17:14
fifoはunixドメインソケットを使って実装されている 事もある

596:デフォルトの名無しさん
07/02/21 00:39:37
whileとforの違いがよくわからないんでお願いします。
あと、最後に;(セミコロン)をつけるのは何のときで、つけないのが何のときか教えてください。

教科書見てもイマイチよくわからなくて・・・

597:デフォルトの名無しさん
07/02/21 00:50:04
>>596
とりあえず使おうとしてる言語はなんなのか言ってみ
シェルのことか?

598:デフォルトの名無しさん
07/02/21 00:54:39
あ、すんません。C言語です。
めっちゃ基礎的なことだけどおねがいします。

599:デフォルトの名無しさん
07/02/21 01:08:32
whileもforも繰り返し行う処理(ループ)を行わせるものだが、

while (式) 文
「式を評価(値を求めること)し、それが0でない場合は 文を実行」
を繰り返し行う。

for (式1; 式2; 式3) 文
式1を評価する。
そのあとは、
「式2を評価し、それが0でない場合は 文 を実行。ついで式3を評価」
を繰り返し行う。

つまりは、
式1;
while (式2) { 文; 式3; }
とほぼ同じ意味。

なお、文とは
- 式に;を付けたもの
- { 複数の文 }
のどちらか。forもwhileも文は1つしかかけないので、複数の文を
繰り返し処理したい場合は { } で囲む。

(実際には1つであっても囲んで構わないし、ヒューマンエラーを避ける
意味ではそのほうが好ましい)


600:デフォルトの名無しさん
07/02/21 01:10:09
C言語なら俺に聞け(入門篇) Part 8
スレリンク(tech板)

こっち向きだろうね。


601:デフォルトの名無しさん
07/02/21 01:11:29
>>599
ありがとう!なんとなくわかったような・・・わからないような・・・
もっかい教科書見直してみるわ。
>>600
あ、そんなスレあったのか。こんどからはそっちで。

602:デフォルトの名無しさん
07/02/21 01:12:40
訂正

式1;
while (式2) { 文; 式3; }

式1;
while (式2) { 文 式3; } まぁ空文が1つあるかないかだけど。

あと「それが0でない場合」しか書かなかったが、0になったら
繰り返しを終えて次に進む。


603:デフォルトの名無しさん
07/02/21 20:12:39
forは式を省略できるが、whileはできないってのも。
永久ループを作るときに、forなら
for(;;)文
で大丈夫だけど、whileだと
while(1)文
の様に書かないといけない。
これは1を評価するという冗長な意味を持つので、for(;;)の方がよく使われてる。
(;;) <- これが顔文字みたいでかわいいし。

604:デフォルトの名無しさん
07/02/21 21:31:32
>>603
最後の2文はおまいの思いこみだw
面白いけどw

605:デフォルトの名無しさん
07/02/21 21:41:24
while (1)はイデオム化しているので、読むほうも「1が0でない限り」
などとは読まないから問題ない。

生成されるコードも大差ない。
MacOSX 10.4.8, gcc 4.0.1 (Intel) でやってみたら、
while (1) { puts("hello"); } / for (;;) { puts("hello"); } いずれも
「文字列のアドレスをスタックに積んでputsをcallしてループの頭にジャンプ」
という全く同じコードになった。


606:デフォルトの名無しさん
07/02/21 21:49:27
for(;;)は無限ループを表すためだけにANSIが規格化した代物。

607:デフォルトの名無しさん
07/02/21 22:37:36
FreeBSD6.2だと
grep -R 'for *(;;)' /usr/src | wc -l
2322
grep -R 'while *(1)' /usr/src | wc -l
883
だから、やっぱりfor(;;)の方が優勢と思う。
確かにwhile(1)はイデオム化してるから問題はないと思うけど、
もしも、全く最適化をしないコンパイラがあれば、少しだけ無駄なコードになるはず、、
まぁそんなことは重要じゃないので、見た目のいい方を選べばいいと思います。

608:デフォルトの名無しさん
07/03/01 19:42:26
以下のMakefileの
$(OBJS): $(HEADS) Makefile
行は何をしているのでしょうか?

URLリンク(www-or.amp.i.kyoto-u.ac.jp)

609:デフォルトの名無しさん
07/03/01 21:02:27
>>608
スレ違い。

610:デフォルトの名無しさん
07/03/01 21:25:06
>>608
make makes many problems
スレリンク(tech板)
あたりか?

一応答えておくと、
$(OBJS)内のファイルに依存性を追加しているだけ。
この行自体は何もコンパイルしたりしない。
「$(HEADS)のファイルいずれかかMakefileが書き換えられたら
$(OBJS)のすべてのファイルはコンパイルし直しとなる」という宣言。


611:608
07/03/01 21:52:57
>>610
良くわかりましたありがとうございます
教えて頂いたスレにも書き込もうか迷ったのですが
過疎っており、都合上解答をできるだけ早めに頂きたかったので
こちらで質問させていただきました
助かりました

>>609
死ねカス
代替案出せないなら黙ってろ

612:デフォルトの名無しさん
07/03/01 22:51:45
カスにカス呼ばわりされてもなぁ。makeスレは過疎ってたって巡回している人は沢山いると思うのだが。

613:デフォルトの名無しさん
07/03/01 22:58:01
>>612
ごめんなさい
core吐きまくっててイライラしてて言い過ぎた
次は教えてもらったスレで紳士的に質問しますね

614:デフォルトの名無しさん
07/03/02 22:03:55
gccのプリプロセッサだけを使いたかったので、子プロセスでcppを起動して
パイプで出力を受け取ったのですが、EOFが来ません。
メインのプロセスはboost::iostream::file_descriptor_sourceで子プロセスの
出力を読み込んでいます。
どなたかお知恵を…

615:デフォルトの名無しさん
07/03/02 22:13:13
入力を閉じる

616:デフォルトの名無しさん
07/03/17 01:01:16
ヘタレ組込みPGです。
下記のようなプログラムが既存のものであるんだけど、sigactionをセットした上でスレッドをぼこぼこ作り、各スレッドにシグナル待ちをさせるコードがあるんだけどシグナルハンドらの関数は処理を何もしていません。
これってどういうことを狙ってるとき、処理なしハンドラを設定してるかわからないんですが、教えてもらえませんか?

void main(void)
{
act_SIGINT.sa_handler = funcA;
act_SIGINT.sa_mask = *sigset;
act_SIGINT.sa_flags = SA_RESETHAND;

sigaction(SIGUSR1,&act_SIGINT,NULL)

for(int i=0;i<5;i++)
{
pthread_create();
}

funcB(); // 実処理

}

funcA{
// 処理なし
}

funcB{
// 何か処理
pthread_kill(スレッドID,SIGUSR1);

}


617:デフォルトの名無しさん
07/03/17 01:33:49
どっか別の場所でsigactionしなおしてるんじゃね?

618:デフォルトの名無しさん
07/03/18 13:12:48
自作のshared objectを作って、その中の関数を呼ぶ別のプログラムを書いたんだが
どうやらshared objectの中にバグがあるようで、落ちる。
shared objectの中でgdbを使ってどこで落ちたのか調べたいのだから
shared objectを呼び出してるプログラムにgdbを適応してrunしてもshared objectの中まで
入ってくれない。
shared objectの中身をgdbでデバッグしたい場合はどうすればいいんでしょうか?
教えてください

619:デフォルトの名無しさん
07/03/19 00:37:58
>>618
> 自作のshared object
のコンパイルオプションは???


620:デフォルトの名無しさん
07/03/29 06:38:54
プログラムが現在使用しているトータルメモリ量を取得する方法を教えてください

621:デフォルトの名無しさん
07/03/29 07:40:28
先ずはあなたの言う、「プログラムが現在使用しているトータルメモリ量」を定義してください。

622:デフォルトの名無しさん
07/03/29 08:40:48
>>620
/procを使う
perlならProc::ProcessTable::Process

623:デフォルトの名無しさん
07/03/29 11:38:11
>>621
プログラムが確保したヒープとスタックと
内部でmallocしようとしてるサイズでいいんじゃね?
まあmallocで100ギガ確保しても使わなければ
メモリは使われないからそれを消費量というかどうかは
定義しなきゃだなぁ

624:デフォルトの名無しさん
07/03/29 14:10:03
mallocした量とmalloc用のヒープ量(sbrk次第?)はまた違うかもしれない。
管理用のデータもあるだろうし。


625:デフォルトの名無しさん
07/03/29 19:24:14
>>620
getrusage(2)

626:デフォルトの名無しさん
07/04/10 21:53:49
Windowsきたねえ!UNIXきれい!
でもWindows使いたい!UNIX使いたくない!
ふしぎ!!

627:デフォルトの名無しさん
07/04/11 08:11:21
エロゲがみんなUNIXで動いたらどうでしょう。

628:デフォルトの名無しさん
07/04/12 13:02:39
あるプログラムをFORTRANからCに書き換えています。
FORTRAN内の配列(かなり大きい)を、Cで同じサイズで確保しようとすると、
実行時に確保できない旨のエラーが出てしまいます。
両方とも同じマシン上で動かしているので、空き領域自体はあると思うのですが、
何か良い方法はないでしょうか?


629:デフォルトの名無しさん
07/04/12 13:05:23
↑エスパー専用

630:デフォルトの名無しさん
07/04/12 13:13:58
>>628
newをつかってみたら?

631:630
07/04/12 13:14:49
動的に確保した方が、大きな値を取れたはず

632:デフォルトの名無しさん
07/04/12 13:17:36
エスパー登場

633:デフォルトの名無しさん
07/04/12 13:23:25
>>628
ソースコンバータで事は足りないの?

634:デフォルトの名無しさん
07/04/12 14:01:29
スタック上に確保しようとして溢れてるってことか。
それならmalloc()とかでヒープに確保しないと。

635:デフォルトの名無しさん
07/04/12 14:38:50
んな面倒なことしないでも、staticで宣言すりゃいいんでないかい。


636:デフォルトの名無しさん
07/04/12 20:37:23
ulimit でスタックのサイズをでかくする

637:デフォルトの名無しさん
07/04/13 21:25:10
limitで制限かけてあると思うけどな。
環境変数でも貼ってくれ。

638:デフォルトの名無しさん
07/04/17 18:44:13
64bitマシンで32bitの整数を扱いたいのですが、int寄りも小さくshortよりも大きい整数はないのでしょうか?
C99を使うしかないのでしょうか?


639:デフォルトの名無しさん
07/04/17 19:17:07
OSとコンパイラは?
gccのx86_64版でsizeof(int)は4だよ。

640:デフォルトの名無しさん
07/04/17 19:24:49
>>638
LP64,LLP64,ILP64あたりでググれ。

641:デフォルトの名無しさん
07/04/18 04:41:26
intってマシン長じゃないの?

642:デフォルトの名無しさん
07/04/18 05:12:16
>>641
違うこともあるお⊂二二二( ^ω^)二⊃。x86_64とか。

643:デフォルトの名無しさん
07/04/18 06:55:21
>>641
そうじゃない例はいくらでもあるが。

644:質問。
07/05/02 03:01:44
あるプログラムから別のプログラムを立ち上げて、
その標準入出力を掴むプログラムをC言語で作りました。

forkで子スレッドを作って呼び出し先プログラムを実行、
パイプでそのstdin,stdoutを呼び出し元から読み書きするまでに至ったのですが、

呼び出し先としてsshやftpを立ち上げてみると、ログインパスワード要求時の
「Password:」 の表示が標準出力じゃないみたいで、
呼び出し元プログラムを通さず、画面に出てきてしまいます。
一体何故でしょうか? またこれの解決手段は何かありますか?

645:デフォルトの名無しさん
07/05/02 03:13:03
stderrじゃね?

646:質問。
07/05/02 03:25:07
>>645
いや、それもしっかり呼び出し元に送ってるんですが・・・。

647:デフォルトの名無しさん
07/05/02 04:27:16
>>644
ssh などは /dev/tty にプロンプトを書いてる。


648:デフォルトの名無しさん
07/05/02 04:31:39
>>644
たぶん君のやりたいことには、
ttyrecやscriptのソースが参考になる。

649:デフォルトの名無しさん
07/05/02 05:25:13
>>644
> あるプログラムから別のプログラムを立ち上げて、 
> その標準入出力を掴むプログラムをC言語で作りました。 

そしてこの仕様に(ry

650:質問。
07/05/02 07:27:32
ネットでいくらか調べてみたけど。。。
sshの自動ログインのパスワード入力突破はみんな悩んでるみたいね。
専用の鍵を作るだとかとても面倒なことになりそうな勢い。

さて、そろそろ寝るかorz

651:デフォルトの名無しさん
07/05/02 07:31:36
そんなもん誰も悩んでないよ。
ssh-agent使えばいいんだから。
プログラミングですらない。

652:デフォルトの名無しさん
07/05/02 07:33:58
マウスを操作して自動的にアプリのボタンをクリックするプログラムを作成するくらい不毛な話だ

653:デフォルトの名無しさん
07/05/02 07:50:53
それだってtcl/tkのtestsuitsにあるけどなw

654:648=651=653
07/05/02 17:01:00
そこでexpectですよ、となるわけかな?

655:デフォルトの名無しさん
07/05/03 00:29:57
そこでExpectですよ
→ そしてTclが嫌になる
→ Perl/Ruby/Pythonとかのexpect風モジュールに逃げる
→ 本家本元のexpectほどのエレガントさや機能がなくてガクーリ
→ でもTclの糞さにInline::Tclに逃げたりRuby+Expectとかのハイブリッドコードを書き出す
→ 他人には理解不能に

いやほんとRubyのシンタックスならTclなみにエレガントにExpectできると
思うんだけどね。ベタなコマンドライン的記法にマッチしてるから。

656:デフォルトの名無しさん
07/05/04 01:17:02
マジアフォだな。
マウスカーソルを横取りして駆動するドライバとか変な苦労しそう。
キーボードコントローラを乗っ取ってキー入力してみたりとか、GPUプログラミングして表示内容を取得とか。

657:デフォルトの名無しさん
07/05/10 21:52:44
 質問をさせていただきます。
 UNIX上で動く簡単なftpデーモンを作っています。

 アクティブモードでクライアントとデータをやり取りするデータコネクションを繋ぐために、
FTPのPORTコマンドで受け取ったクライアントのIPアドレスとポート番号をsocket関数に渡して
ソケットを作り、connect関数でコネクションを繋ぎました。
 ここで20番ポートを使ってデータコネクションを繋ぐように本に書いてあったのですが、
サーバー側のポート番号はどこかで指定するのでしょうか?

 制御コネクションの接続の時にはbind関数で21番ポートを指定しましたが、それにあたるような
処理がconnect側にも必要なのでしょうか?

 どこかで根本的な勘違いをしてるのか、調べても解答を探すことができませんでした。
 お手数ですが、どなたがご助言をいただけないでしょうか?

658:デフォルトの名無しさん
07/05/11 00:03:42
>>657
アクティブモードのデータコネクションは、FTPサーバからクライアントにコネクションを張りに行くわけだから
制御コネクションとは接続方向が逆って辺りは理解している?
まぁ、詳しくはネットワークスレを読めばリンクが出てくると思うけど。

659:デフォルトの名無しさん
07/05/11 01:19:45
RFCちゃんと読んでる?

660:デフォルトの名無しさん
07/05/11 06:09:45
>>657
サーバー側のポート番号を指定するのはPASVの場合

661:デフォルトの名無しさん
07/05/12 00:25:23
PORTとかEPRTのばあいは黙ってconnectすればいい。
PASVとEPSVの場合は、bind-listen-acceptして待ち受けてればいい。

662:デフォルトの名無しさん
07/05/12 01:19:48
>>658
その時のsrc portの話だと思われ。

>>657
制御コネクションを21番でbindしてlistenしたように、
データコネクションは20番でbindしてconnectすればいい。
bindせずにconnectすると適当なportが使われる。

663:657
07/05/12 01:27:58
>>658-662
たくさんのご助言、ありがとうございました。
bindはacceptする側だけだと思い込んでいて、データコネクション側では20番ポートでbindしていませんでした。
さっそく、bindしてみます。
それでは失礼いたします。

664:デフォルトの名無しさん
07/05/14 21:30:04
javaファイルをpostscriptに変換して印刷しようとして
a2ps test.java
と入力したのですが、印刷されませんでした。
なぜですか?

665:デフォルトの名無しさん
07/05/14 21:47:58
>>664
今時の a2ps は, 出力をかってに lpr あたりに食わしてくれるのか?


666:デフォルトの名無しさん
07/05/15 00:27:25
はい


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch