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

■ このスレッドは過去ログ倉庫に格納されています
2011/04/18(月) 17:06:36.77
UNIXおよびUNIX clone環境一般のプログラミングに関する質問スレッド 

前スレ 
Part9 http://hibari.2ch.net/test/read.cgi/tech/1205795434/
Part8 http://pc11.2ch.net/test/read.cgi/tech/1147946176/ ;
Part7 http://pc8.2ch.net/test/read.cgi/tech/1127373405/ ;
Part6 http://pc8.2ch.net/test/read.cgi/tech/1116908090/ ;
Part5 http://pc8.2ch.net/test/read.cgi/tech/1105723117/ ;
Part4 http://pc5.2ch.net/test/read.cgi/tech/1095843584/ ;
Part3 http://pc5.2ch.net/test/read.cgi/tech/1085930894/ ;
Part2 http://pc5.2ch.net/test/read.cgi/tech/1055110889/ ;
Part1 http://pc2.2ch.net/tech/kako/992/992057422.html ;


Part3のミラー 
http://makimo.to/2ch/pc5_tech/1085/1085930894.html ;
Part2のミラー 
http://makimo.to/2ch/pc5_tech/1055/1055110889.html ;
466464
垢版 |
2012/05/02(水) 12:10:30.82
>>465
loop unrollingっての知らなかったです。
ひとつ賢くなりました!

Wikipedia: “毎回の繰り返しごとに発生する「ループの終了」条件のテストを
減少させる(もしくはなくす)事によって、実行速度を向上させる”
・・ですね。

でも、「ループの終了」条件のテストをforにいれず、
結局1行ごとに4行毎回判定してるので、なんとなく関係ないような気が・・

あと一応、測定してみましたが、4行に分けるより、
1行にまとめたほうがわずかばかり速そうです。
※VMware上 Linux x86_64 gcc4.4.6 -O3 で、100000000回ループを30回測定
(なんでそういう結果が出たかは調べていません)

それとも、やっぱり状況によっては 4行書いたほうが最適化とかかかって
速くなったりするものなのでしょうか。
2012/05/02(水) 15:45:45.03
ていうか、djbのスタイルを参考にするのはやめれ。
根性で標準ライブラリを使わん、とか、癖があり過ぎる。
2012/05/02(水) 15:55:45.32
>>466
速度に関する最適化は、普通にコーディングした後に、どうしても速度的な要件を満たせてないときに
限って、ボトルネックがどこか「実際に測定して場所を特定」してから行うもの。

数nsレベルの調整なんかしなくていい。
469464
垢版 |
2012/05/02(水) 16:43:21.92
もちろんスタイルをまねする気も、速度を気にしてるわけではないですよ。
普通の人から見たら、ただの縛りプレイにしかみえないですし。

ただ、偏執狂なんていわれるほどの人だから、
この意味無いように見えるコードも何かあるのかな、と。

daemontoolsはよく使いますので、
コードも見てみようと思ったのが発端です。
2012/05/02(水) 18:07:50.56
本当に意味わかんないなこれ。
4bytes コピーして最適化したつもりが気が変わって無理矢理戻したとか、いや違うな。
素直に strlen() 使った方が最適化してくれていいのになあ。
2012/05/02(水) 18:49:53.19
どうせ最適化がかかるだろうし無駄な書き方ならライセンスで面倒なことが起きないとか?
2012/05/02(水) 19:01:32.57
>>466
>でも、「ループの終了」条件のテストをforにいれず、
>結局1行ごとに4行毎回判定してるので、なんとなく関係ないような気が・・

そう思う。さらにループ内でtの値が変化するから並列化も期待できないし。

ちなみに>>445の人を真似して(syscallでとんでもないものを紹介してたのはアレだが)
glibcのstrlenを見ると、
http://sourceware.org/git/?p=glibc.git;a=blob_plain;f=string/strlen.c;hb=c0da14cdda1fa552262ce3624156194eef43e973

まずlong intのサイズ毎にビット演算して0バイトがないか調べて(ちょっとトリッキー)、
もしあったら詳細に調べるみたいな感じのことをしてる。
インテルならXMMレジスタ(16バイト)を使うとさらに効果的。https://gist.github.com/77178
2012/05/02(水) 19:07:11.52
いずれにしろ、その部分が、全体の90%の時間を食ってる、10%のコードだ、
ということがわかってからでいいことだな。
474464
垢版 |
2012/05/02(水) 21:40:41.21
結局なにがしたいんだか分からないなー。

>>472
>まずlong intのサイズ毎にビット演算して0バイトがないか調べて(ちょっとトリッキー)、
>もしあったら詳細に調べるみたいな感じのことをしてる。
>インテルならXMMレジスタ(16バイト)を使うとさらに効果的。https://gist.github.com/77178
glibcのstrlen、すごいことしてるんですね。
特にビット演算のマジックナンバーが全然意味分かりませんでしたが、
説明をググったら解説があって、なんとなく分かったような気にはなりました。
なんすか、よく思いつくなと。

もう一個のアセンブラのほうは、
ニーモニックが全然分かってないので辛くて読んでませんが、
とにかく、案外、工夫のしがいがあるものなんですね。
2012/05/05(土) 16:38:05.82
非分岐時のみ投機実行のあるRISC系のCPUなら4行展開して意味ありそう。
けどCPUのアーキテクチャにベタベタに依存するコードだし、
遅延スロット埋める投機実行はもっと高度になってるから活躍の場は殆ど無いだろうね。
2012/06/01(金) 01:43:26.38
シェルスクリプトの質問なんですが、
いちいち別のサーバにログインしたりするのがめんどいので、
一つのシェルスクリプトで、
ローカルマシンとリモートマシンの実行結果を
マージしたりする仕組みって無いんですかね?
#!/bin/sh
num1=$HOME
num2=@$HOME<-例えば@の後ろに何か処理を書くとその処理は設定されたリモートで実行される
echo $num1<-ローカルの$HOME
echo $num2<-リモートの$HOME
2012/06/01(金) 11:26:58.67
man rsh
man ssh
2012/06/27(水) 18:49:44.31
Linuxで、ライブラリとかにデバッグ用のシンボルが付いてるかどうかって
どうやったら調べられましたっけ。
2012/06/27(水) 19:36:48.08
fileコマンドでstrippedと出るか出ないか、かな?
2012/06/27(水) 19:48:46.08
nm -a
2012/06/30(土) 07:43:47.53
ncursesのC++実装について分かる方教えてください
482481
垢版 |
2012/06/30(土) 08:23:23.34
自己解決しました
2012/07/01(日) 22:18:43.78
マルチバイト文字を出力する方法がわかったのですが、
複雑なので他の方の参考になるように
ここに書いておきます

/* cc -o test test.c -lcursesw */
#define _XOPEN_SOURCE_EXTENDED
#include <curses.h>
#include <wchar.h>
#include <locale.h>

int main() {
cchar_t ch;
wchar_t wc[2] = L"あ";

setlocale(LC_ALL, "");

initscr();

setcchar(&ch, wc, 0, 0, NULL);
add_wch(&ch);

getch();

endwin();

return 0;
}
2012/07/10(火) 04:13:32.60
>>466
アセンブラに直せばわかるのに
2012/07/10(火) 18:27:57.31
>>483
これじゃ駄目なの?

$ cat test.c
#include <stdio.h>
int main() {
puts("あ");
return 0;
}
$ gcc -o test test.c
$ ./test
2012/07/10(火) 18:44:35.03
>>485
cursesでマルチバイト文字をどう扱うかって話だよ
2012/07/12(木) 01:18:29.66
素直にncurcesw使えばいいんでないかと思う
2012/07/25(水) 21:25:11.82
>>484
UNIX界隈にもアセンブリをアセンブラ呼ばわりする人が居るんだな
2012/07/25(水) 21:35:35.20
アセンブリ言語
490デフォルトの名無しさん
垢版 |
2012/07/28(土) 08:38:10.33
教えてください

静的ライブラリと、LD_PRELOADで指定された共有ライブラリでは、
静的ライブラリのほうが必ず先にロードされる、で正しいでしょうか?
2012/07/28(土) 09:26:29.66
静的ライブラリは、実行形式ファイルの生成時にロードされ、リンクされる。
共有ライブラリは、実行形式ファイルの実行時にロードされ、リンクされる。

ということで、タイミングとしては静的ライブラリの方が時間的に早いので
その意味では正しいと思われます。
2012/07/28(土) 10:10:31.58
LD_PRELOADで指定されてる方がタイミング的には先だな
2012/07/28(土) 11:25:17.45
>>492
間違いです。
2012/07/28(土) 11:31:01.01
くだらないこと気にしてないで重複しない命名規則をだな、
2012/07/28(土) 11:35:58.83
デバッグ時に使いたいって話だよ
2012/07/28(土) 11:37:06.57
>>494
経験浅い人は黙ってて
2012/08/02(木) 19:32:15.27
pidの分からない複数の子プロセスにシグナルを送る方法はありますか?
2012/08/02(木) 21:30:52.30
>>497
kill()関数でpidにゼロや負数を入れるといいらしい
2012/08/02(木) 22:28:29.91
>>498
ありがとう,解決できました
500デフォルトの名無しさん
垢版 |
2012/09/17(月) 22:19:03.43
http://www.cs.miyazaki-u.ac.jp/~date/lectures/image_process2012/labeling201209gp40_uc.c

画像処理ラベリングのプログラミングなんですがこの穴あきをおしえてください

ここで間はなにをするとこなのかおしえてくださいorz
2012/09/17(月) 22:51:30.17
このプログラムを書いた人に訊きなさい
502デフォルトの名無しさん
垢版 |
2012/09/17(月) 23:28:29.51
馬鹿には聞いてません
503デフォルトの名無しさん
垢版 |
2012/09/18(火) 01:14:44.29
>>501

すみません、現在その人と連絡がとれなくて、困っています
504デフォルトの名無しさん
垢版 |
2012/09/18(火) 01:23:00.19
>>500 文字化けしてますかね??
for (y=0; y<h; y++){
for (x=0; x<w; x++){
i = y*w +x;

k = init[i];
while ( identical[k] != 0 ){

ここの間
identical[k] = 0; // ダミー
}
final[i] = k;
printf("%3d", final[i]);
}
printf("\n");
}
のとこです
2012/09/20(木) 00:24:53.72
豚切りすいません。
超初心者です....
touchでファイル作ろうとしたらpermission denied ってなるんで
chmodでパーミッション変更しようとしてもどうやら元々の奴の権利を変えるだけのモノ?
みたいで、作成できるように権限を変えたいのですが、
どなたか教えてもらえるとありがだいです。
2012/09/20(木) 01:22:55.36
ディレクトリにchmod
あと.hogercの確認
2012/09/20(木) 05:02:08.38
馬鹿には無理
2012/09/21(金) 20:51:51.26
505です。
レスありがとうございます。
あれから chmod 777を打ったんですが
Unable to change file mode on
と出てきてしまいました。
509505
垢版 |
2012/09/21(金) 22:01:57.26
何度もすいません。
ごめんなさいm(_ _)m
ディレクトリの権限がrootだったのでユーザーから作るのはやめて、
rootでファイルを作りました。
そのファイルというのは~.phpでして、それでhttp://localhost/~.phpをクリックしても
白紙でした。
どうすればPHPの情報が表示されるようになるのでしょうか⁇
2012/09/21(金) 22:37:37.44
プログラミング以前に、操作がままならないんだから、
UNIX板orLinux板の初心者スレに行け。
511デフォルトの名無しさん
垢版 |
2012/10/08(月) 16:57:39.28
オープンソースなLinuxって何でもかんでも無料で大丈夫なんだろうか
2012/10/08(月) 18:47:25.65
だからGNUやFSFが共産主義的思想に基いているという噂が広まるんだよ
2012/10/08(月) 19:31:21.24
板違いってことさえわからない頭で考えても無駄。
2012/10/08(月) 20:09:56.73
>512
それは噂じゃなくて事実www
2012/10/10(水) 14:24:45.90
ディレクトリストリームに関する質問です。
open関数にディレクトリのパスを入れると、ディレクトリストリームという
ものがオープンされると参考書に書かれています。
これは、open関数が"ハードディスク上"のディレクトリの中身の
ディレクトリやファイルの情報を"メモリ上"のstruct dirent構造体に
マップしていっていると考えていいのでしょうか?

あとreaddir関数に関する質問なのですが、この関数の引数のstruct dirent
型のポインタはreaddir関数で+1してから、このポインタに上書き(?)されて
ますか?それとも初めに引き渡されたポインタを保持してますか?
まだ勉強中なので的確な言葉選びができてなくて回りくどい言い回しに
なってそうですが教えてください。
2012/10/10(水) 15:07:31.31
>>515
openシステムコールなら
http://kazmax.zpp.jp/cmd/o/open.2.html
2012/10/10(水) 15:36:47.63
>>516
すみません間違えました。
open関数じゃなくてopendir関数でした。。。

この辺の認識が正しいかどうかはヘッダファイル見ていけば
わかるんですかね?
ヘッダファイルなんて現時点のスキルで読み始めたら時間かかって
しょうがねえだろうなあと思ってるんですが。
2012/10/10(水) 15:45:22.84
>>515
"opendir source code"でググって、ソース読め
2012/10/10(水) 15:46:09.33
>>517
システムコールの本を調べたら
2012/10/10(水) 16:15:37.67
>>518,519
キーワードあざっーす!
この辺に入っていかないとダメなんですね。

ずぶずぶやないかぁ・・・
2012/10/10(水) 16:25:38.33
勉強中なら、ストリームという概念がわかったところで次に行った方が良いんじゃないかと思うけど
まぁ人それぞれだよね。
2012/10/11(木) 00:06:26.42
scp 転送元ディレクトリ/*.* ./test

を実行したときカレントにtestというディレクトリが無いと
testというファイル名でファイルができてしまいます。
testディレクトリがなかったらエラーになるようにしたいのですが
どうしたらいいでしょうか?
2012/10/11(木) 00:11:06.80
>>522
そういうプログラムをつくればおk
2012/10/11(木) 00:49:13.63
scp 転送元ディレクトリ/*.* ./test/
525522
垢版 |
2012/10/11(木) 18:46:55.30
>>524
おお、できました。そういうのがしたかったです。
ありがとうございました。
2012/10/19(金) 07:30:16.88
openした際にメモリ上にマップされるFILE構造体のメンバに
ファイルディスクリプタがあると思うのですが、
同じファイルをopenするプロセスが複数あるとき、
それぞれのプロセス内のFILE構造体のメンバである
ファイルディスクリプタは異なる値で、実データへのポインタ
(inodeと対になっているメタデータ)は共有という理解で合ってますか?
2012/10/20(土) 01:57:02.57
ファイルディスクリプタは、プロセスごとに定義されているので、
偶然同じ値であることがあります。
stdin, stdout, stderr以外にファイルはオープンしてない場合、
次にfopenしたファイルのファイルディスクリプタは3です。

要するにファイルディスクリプタは全プロセスにまたがった固有のIDと見做せません。
2012/10/20(土) 06:15:36.17
>>527
ありがとうございます。

ようやくマルチタスクなる物が何なのかわかってきました。
2012/10/20(土) 07:26:12.03
>>528
君のレベルが分かりました
530デフォルトの名無しさん
垢版 |
2012/10/21(日) 04:02:48.75
プログラムを走らせると、topで見るとsystem CPUの値が異常に高いのですが、
systemってどんなことをした場合に消費されるのでしょうか?
2012/10/21(日) 07:06:44.21
ソウルからヨボセヨ 「ハングル輸出」は虚報 2012.10.20 03:01 [韓国]


 韓国独自の文字であるハングルは民族的自慢のタネで、10月9日が「ハングルの日」として以前は祭日だった。
 しかし祭日が多すぎると休日からははずされたため、復活を望む声が強い。
 来年には復活の可能性があるとかで、カレンダー業者が気をもんでいる。

 そのハングルをめぐってまずい話が起き問題になっている。
 先年、インドネシアの小さな島の部族がハングルを自分たちの「公式文字」に採択したというニュースがあり
「ハングルの優秀性を世界に示した」として官民挙げて大喜びした。

 教科書でも紹介されるまでになったのだが、最近、この話はマスコミが誇張したもので「公式文字採択」は虚報と分かった。
 政府も教科書や各種展示を手直しすることになったという。

 この少数部族というのはスラウェシ島に近いブトン島のチアチア族といい人口は6、7万人とか。
 固有の部族語を話しているが、韓国の団体が援助を餌にその部族語の表記にハングルを使うことを勧めた。

 その結果「公式文字に採択」となったというのだがインドネシアはローマ字が公用文字。地方の部族が別の文字を
公式文字に採択するのはありえない。
 実際は単にハングルを学んでいるといった程度だったのだ。ハングル愛国主義の勇み足である。(黒田勝弘)

http://sankei.jp.msn.com/world/news/121020/kor12102003020000-n1.htm
2012/10/21(日) 14:04:47.52
>>530
システムモードのCPU使用率が高いということは、つまりカーネルで動作していた時間が
多かったことを意味する。

例えば、ファイルのopen, closeを繰り返してファイルシステムやデバイスドライバばかり
動しているとか
2012/10/27(土) 22:06:34.21
>>532
>例えば、ファイルのopen, closeを繰り返してファイルシステムやデバイスドライバばかり
>動しているとか

この理由付けはどうなんだ
2012/11/01(木) 00:23:16.28
>>530
メモリ足んなくて、メモリスワップしてるような状況でもsystemが上がりがちですかね。
2012/11/01(木) 09:46:46.73
>>530
状況も説明せんと分かるわけがない
2012/11/05(月) 01:34:52.74
思いつくのを適当に列挙すると
・ユーザーランドから無駄にシステムコール発行してる
・ドライバが腐ってる
・ハードが壊れてる
・アタックされてる
かねえ
537デフォルトの名無しさん
垢版 |
2012/11/17(土) 19:30:00.85
教えてください

/proc以下の仮想ファイルと同様の仕組みを、自作アプリケーションの内部変数を
外から確認するのに使いたいのですが、それ用のAPIはありますか?

また、ターゲットに考えているアプリはパフォーマンスが非常に重要なのですが、
各種の高速ソフトウェアを動作させることが可能なOS自身が/proc以下を提供しているのだから、
そのような仕組みは処理のボトルネックにはならないだろうと期待しているのですが、どうですか?
2012/11/17(土) 19:37:46.89
text I/Oだから普通にボトルネックになりうる。
mmapを使ってください。
2012/11/17(土) 19:49:57.94
>>538
ありがとうございます!
2012/11/17(土) 23:31:49.74
system()で生成した別プロセスに対してシグナルを送信する場合、典型的にはどれくらいの時間がかかりますか?
(人間の感覚では一瞬ですが、たとえ一瞬でも実際は有限の時間がかかりますよね?)
また、シグナルと同様にプロセス間で非同期の通知をするための高速な方法は他にありますか?
2012/11/17(土) 23:45:34.34
シグナルはそんなに速くないよ。
特にシグナルハンドラー使う場合。
ハンドラはカーネル空間でなくてユーザ空間で実行しないといけないから。
システムコールにブロックされる可能性あるから、
シグナル割り込み可能性や再入可能性で調べてみて。

セマフォアやpthread_mutex(ただしプロセス間拡張あるUNIXで)使った方がいいよ。
2012/11/18(日) 00:05:08.76
>>541
そうなんですか・・・(´・ω・`)
msec以下での応答は難しいですかね・・・・・?
2012/11/18(日) 00:15:04.12
使うシステムコールやマルチスレッドかどうかによる。
ちなみにmsecレベルの応答性なら
高速性は必要とされてない応用にカテゴライズされると思う。
2012/11/18(日) 00:21:06.76
>>540
蒔きに火をつける時間と、のろしをあげる時間が必要
2012/11/18(日) 00:26:16.02
>>543
そうなんですか・・・喜
あ、スレッド間じゃなくプロセス間で

>>544
送信側でもたつくという意味ですかね?
2012/11/18(日) 00:28:46.80
マルチスレッドかどうかは、
中断可能じゃないシステムコールを呼んでいる時に
シグナル受けて処理に時間がかかるかどうかに関わってくる。
マルチスレッドなら、シグナル受けるの専用のスレッド置いておけば良い。
2012/11/18(日) 00:31:11.12
>>546
勘違いしていました

よく分かりました・・・・謝
2012/11/18(日) 04:39:58.63
>>544
ONした後は光速で伝わるから
馬脚よりは高速なんですね
わかります
549デフォルトの名無しさん
垢版 |
2012/11/18(日) 14:04:51.05
Intel&nbsp;Xeon&nbsp;Phiを扱えるコンパイラーを教えてちょ
2012/11/18(日) 15:07:05.74
gcc
2012/11/18(日) 21:02:49.61
素直にicc使えば?
2012/11/19(月) 02:02:44.98
>>541
共有メモリにフラグ用意して、RTプライオリティにしたプロセス間で
ポーリングかけるのが時間安定性的に一番確実な気がしないでもない

CPU食いまくるが
553デフォルトの名無しさん
垢版 |
2012/12/07(金) 18:16:20.75
初心者なので間違っているかもしれませんが、
おそらくデータリンク層に関する質問です。

例えばプログラムでIPプロトコルを使って、
LAN内のサーバにデータを送るということをしようとする場合、
プログラムではIPヘッダに対応するstruct sockaddr構造体のメンバに
情報を与えるということしか行っていないと思うのですが、
Ethernetヘッダはプログラムを書いてコンパイラを通すと、
送信処理を行う時は NICを通してEEPROMからMACアドレスを読み込んで
それを送信バッファに 書き込むという処理がアセンブラコードに
書かれていると考えていいのでしょうか?
554デフォルトの名無しさん
垢版 |
2012/12/07(金) 18:23:54.52
なんでやねん。
2012/12/07(金) 18:30:08.87
初心者とは謙虚な
2012/12/07(金) 18:40:22.62
>>553
そう考えては駄目です。そうなっていませんから。
2012/12/07(金) 18:47:57.21
>>558
UNIXプログラミングスレでの質問なのでUNIXでどうなっているかというと、
L3(IPパケット)ヘッダやL2(Ethernetパケット)ヘッダを作るのはOSカーネル内の
プロトコルスタックと呼ばれているモジュールが行う。

組み込みなどでキミが想像しているようなライブラリでの実装もあるかもしれない。
2012/12/07(金) 19:04:09.57
お、おれに言われても…
2012/12/07(金) 20:26:33.52
>>558
もう一回言うからよく聴け。
それはカーネルの仕事でユーザプログラムの仕事じゃない。
2012/12/07(金) 20:53:34.27
>>553
やってて楽しいか?
2012/12/07(金) 21:31:20.37
>>553
ネットワークすれで聞けば
562デフォルトの名無しさん
垢版 |
2012/12/08(土) 07:25:35.96
>>557
さすがエスパー様
仰る通り組み込みを想定しておりまして、
ハードウェアから勉強するしかねえなーと思いながらちょこちょこ
勉強しだしているのですが、なにぶんノーマルの処理を知らないのです。
プロトコルスタック勉強してみます。ありがとうございます。

>>560
ひとつひとつ論理的な積み重ねで物ができるとおもしろいです。

>>561
折を見て聞いてみます。とりあえずプロトコルスタックなるものを
勉強してみます。誘導ありがとうございます。
2012/12/08(土) 09:53:49.69
プロトコルスタックを自前で書いてたら一生かかっても終わらねえよ。
2013/06/20(木) 10:09:48.69
echo aaa > test.txt
のようなテキストファイルに文章を追記するコマンドの使い方がありますが
半角スペース入り半角記号入り改行入り半角英数字文字列をテキストファイルに追記もしくは新たにテキストファイルを作成する
コマンドはありますか?バッチファイルを作成したいのでviでテキストエディタを起動して作成等の方法は使えません。
2013/06/20(木) 11:12:49.75
echo " aaa
aaa " > test.txt
とかでどう
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況