UNIXプログラミング質 ..
[2ch|▼Menu]
495:デフォルトの名無しさん
05/07/10 02:20:34
あるいはデバッグ時には、main()の先頭かあるいは
デバッガを使って実行前に
_Xdebug = 1;
をしておくという手もある。(遅くなるが)
こうすると、毎回XSync()するのと同じ効果があるので、
パラメータ間違いがあった場合すぐにエラーが起きる。
これって昔は常識だったけど、今は lost technology
に近い?


496:デフォルトの名無しさん
05/07/10 02:24:56
そもそも生の Xlib 自体が lost technology に近い

497:デフォルトの名無しさん
05/07/10 03:16:21
今更X Windowを何かのシステムのインタフェースに
使おうという発想がlost ideaだ

498:デフォルトの名無しさん
05/07/10 10:20:30
>>400は本当に生のXlibでいいのか?
Motif, gtkとかフレームワークもいろいろあるが…
URLリンク(www.free-soft.org)

499:デフォルトの名無しさん
05/07/10 10:30:28
Qt

500:デフォルトの名無しさん
05/07/10 11:24:14
QtはGPLだから用途によってはまずいぞ。
LGPLなgtkの方がまだ安全。

501:デフォルトの名無しさん
05/07/10 11:28:11
え?Qtはライセンス料払えば非GPLでもOKやん。

502:デフォルトの名無しさん
05/07/10 11:26:37
Windowプログラミングは初めてなのですが、何か良い入門書があったら教えてください

503:デフォルトの名無しさん
05/07/10 11:29:46
金を払ってQtを使う阿呆は(ry

504:デフォルトの名無しさん
05/07/10 11:56:34
>>502
釣りでないならスレ違い。

505:デフォルトの名無しさん
05/07/10 11:57:48
マックプログラミングは初めてなのですが、何か良い入門書があったら教えてください

506:デフォルトの名無しさん
05/07/10 12:15:56
面白くないよ

507:デフォルトの名無しさん
05/07/10 12:30:47
>>504
書籍の質問はダメですか?

508:502
05/07/10 12:58:29
わかりました別スレに行きます。さようなら

509:502
05/07/10 12:58:59
わかりました別スレに行きます。さようなら

510:502
05/07/10 13:02:04
わかりました別スレに行きます。さようなら

511:502
05/07/10 13:00:12
わかりました別スレに行きます。さようなら

512:493
05/07/10 14:04:33
皆さんどうもありがとうございました
いろいろとやってみたのですがどうもうまくいきませんでした
font_fontsetに入れるところでエラーになります。
何が悪いのかは本当にけんとうもつきません

したは、簡略化したコードです
何かうたがうてんなどありますでしょうか?

int main( int argc, char **argv){
Display *disp;

disp = XOpenDisplay( NULL);
font_set( disp);
}

void font_set( Display *disp){
char **misss;
int miss_count;
char *def;

XFontSet font_fontset;

font_fontset = XCreateFontSet( disp, "-mona-gothic-medium-r-normal--16-*", &misss, &miss_count, &def);
}



513:デフォルトの名無しさん
05/07/10 16:44:19
それ実行してみたが、特にエラー出ないんだけど?

514:493
05/07/10 16:54:34
はい、わたしも上記のだけですとエラーはでないです
上記のようなコードを書く際になにか注意事項のようなものはありませんでしょうか?

515:デフォルトの名無しさん
05/07/10 16:59:04
回答不能な質問するな

516:デフォルトの名無しさん
05/07/10 17:00:43
解答できないのなら書き込むな

517:デフォルトの名無しさん
05/07/10 17:12:01
真性のアホか。
そういう時はエラーが確実に発生する簡略化したコードを貼るんだ


518:デフォルトの名無しさん
05/07/10 17:14:06
>>494-496 を 150 万回くらい読みなおすこと。

通常は Xlib の関数を呼んだからといって
その時点でサーバにリクエストが投げられるのではない
(効率のためバファリングされる)
ということを頭に入れておくこと。

>>516
馬鹿は黙っていること。

519:デフォルトの名無しさん
05/07/10 17:23:42
おまえらちんこ生えてるくせになまいきいってんじゃねーよ

520:デフォルトの名無しさん
05/07/10 19:51:47
>>519
金玉も無いくせに(以下同文)

521:デフォルトの名無しさん
05/07/10 22:00:59
とりあえず、
X protocolは非同期メッセージを使ったprotocolで、
Xlibはその非同期メッセージを直接扱うAPIであること、
を理解してください。


522:デフォルトの名無しさん
05/07/10 22:01:23
>>519 お友達になってください。おながいします。

523:デフォルトの名無しさん
05/07/10 22:47:03
>>516の尻の穴で我慢しる

524:デフォルトの名無しさん
05/07/11 17:52:50


525:516
05/07/11 17:58:37
>>522
いれて、、、、、、、、、、、
ポッ



526:デフォルトの名無しさん
05/07/11 19:05:03
皆さんのお知恵をかりたいのですが

OS: Linux CentOS 4

自作アプリ内からの firefox 起動/終了について

アプリには、firefox起動メッセージとパラメータとしてURLがきます。
(URLはその都度変化する)

するとアプリは
1. スレッドをDETACHEDで生成
2. "1"のスレッドで system("firefox <URL>"); を行い firefox を起動
3. syste() が終了したら、
  メインスレッドにメッセージを送信して"1"のスレッド終了

としてます。


527:526
05/07/11 19:05:29
続き

アプリには複数回メッセージがきます。
その都度上記処理を実行し、これにより複数のURLに対してそれぞれ
firefoxウィンドウ が開きます。


ここで質問です、
特定のURLへの firefoxウィンドウが閉じたというアクションを自アプリ内で
どうすれば知ることが出来るでしょうか?


当初、各子スレッドが system(3)でブロックすることを期待していたのです
が firefoxは、既に起動していると既存のfirefoxプロセスにて新URLへのウ
ィンドウを開くため system(3)がすぐに終了してしまいます。

よろしくお願いします。


528:デフォルトの名無しさん
05/07/11 19:34:37
>>527
firefoxが生きている間待ちつづけるスクリプトを書くとか

529:デフォルトの名無しさん
05/07/11 19:41:24
拡張とか書かないと無理じゃないかねぇ。

530:527
05/07/11 19:56:25
>>528
ちょっとイメージがわきません。
詳しく教えていただけますか?


531:デフォルトの名無しさん
05/07/11 19:56:32
systemじゃなくて fork + exec じゃだめなんか?


532:527
05/07/11 20:12:31
>>531

pid_t child;

if ((child = fork()) == 0) {
  execlp("firefox", "URLリンク(www.linux.or.jp)", (char*)0);
}

if (child < 0) {
  goto end;
}

waitpid(child, NULL, WNOHANG);

をやったのすが、指定したURL URLリンク(www.linux.or.jp) が表示されず、
また waitpid もすぐ戻ってしまいました。

どうすればいいんだろう...


533:デフォルトの名無しさん
05/07/11 20:24:35
execlpの引数合ってる?

534:デフォルトの名無しさん
05/07/11 20:26:19
> firefoxは、既に起動していると既存のfirefoxプロセスにて新URLへのウ
> ィンドウを開くため

が真実ならば、fork() & exec()で実行しようが何の解決にもならんだろ
馬鹿馬鹿しい

535:デフォルトの名無しさん
05/07/11 21:57:58
ソース読めばぁ?

536:デフォルトの名無しさん
05/07/11 22:37:12
つーか、ソフトウェア板行ったら、
誰かがその目的に合った拡張を書いてくれると思う。

537:526,527
05/07/12 13:33:12
dirtyな方法でしょうが、なんとか動かすことができました。
とった手段は次の通りです。


1.スレッドでURLに対応したプロファイルを作成する
 プロファイルは既存のものでも大丈夫なようです。

  system("firefox -CreateProfile <profile>");


2."1"のプロファイルを指定し、firefox を起動
  system("firefox -P <profile> <url>");

  新規に作成したプロファイルの場合、標準エラー出力にエラー/警告がでます。


上記によりその都度 firefoxが別プロセスで起動し、子スレッドが system でブロックするようになりました。
firefoxを閉じると system から戻ります。


他に良い方法がありましたらどうぞご教授下さい。
色々考えてくれたか方々、ありがとうございました。


538:デフォルトの名無しさん
05/07/12 20:01:45
>>537
だからさー、何でソース読まないの?

539:537
05/07/12 20:52:14
         -、            ,.-、
        ./  .\          /  ヽ
       /    ;ゝ--─-- 、._/    .|
       /,.-‐''"´          \   |
     /                ヽ、 |
    /  ●                ヽ| >>538
     l       (_人__ノ         ●   l いや、そんな事言われても
    .|  ´´    |   /            |             ワテ猫やし
     l        ヽ_/         ´´  l
    ` 、                    /
      `ー 、__              /
          `'''ー‐‐─‐┬‐‐'''""
           /      |
           /        |

540:デフォルトの名無しさん
05/07/12 21:08:08
>>539
なごんだ

541:デフォルトの名無しさん
05/07/14 00:27:29
APUEの新版買った人いる?
いたら感想聞かせて


542:デフォルトの名無しさん
05/07/17 07:40:38
クラスの関数でEUCの文字列をUTF-8に変換するものを作りました。
これをあるプログラムから呼ぶと正しく処理できるのに、別のプログラムから
呼ぶとiconv_open()の部分で
 iconv_open(): Invalid argument
とエラーになってしまいます。iconv_open()の引数は固定なので上記のような
エラーにはならないと思うんですが、こういうことはどういう原因で起こりえる
のでしょうか? 曖昧な質問ですみません。

2つのプログラムは同じ環境でコンパイルして動かしています。
MiracleLinux2.1 + gcc3.2.2 + glibc2.3.2です。
---
class Hoge
{
 ( ... 略 ... )
 void Hoge::UTF8deHyouji(const char*str)
 {
  ( ... 略 ... )
  iconv_t cd = iconv_open("UTF-8","EUC-JP");
  if(cd == (iconv_t)-1)){
   fprintf(stderr, "iconv_open(): %s", strerror(errno));
   return;
  }

  if(iconv(cd, &inbuf, &inleft, &outbuf, &outleft) == (size_t)-1){
   fprintf(stderr, "iconv():%s", strerror(errno));
  }
  iconv_close(cd);
  ( ... 略 ... )
 }
}
  

543:デフォルトの名無しさん
05/07/17 09:36:49
まずmainの直後でやれ
話はそれからだ

544:デフォルトの名無しさん
05/07/17 09:39:21
man iconv_open の ERRORS のセクションはご覧になってらっしゃる?


545:542
05/07/17 12:57:11
>>543
変換部分だけを切り出して実行すると正常に動作します。
またクラスから呼び出して動作する場合もあるのです。

もともとは大きな(?)プログラムの中で使用されていたクラスで
そこではエラーになるので、クラスの関数だけ呼び出して実行
する簡単なプログラムで試したらエラーが出ないという謎の状況
です。

>>544
変換だけ行うプログラムなどでは正常に動作するので、サポートは
されていると思うのです。また、iconv -l でもEUC-JP、UTF-8がある
ことを確認しました。同じ環境でプログラムによってEINVALが返って
しまうことはあったりするのでしょうか…?



546:デフォルトの名無しさん
05/07/17 13:57:34
iconv_openの呼び出しをstraceしてみるトカ

547:542
05/07/17 14:40:26
>>543
ふと思い立って、動かないほうのプログラムのmain()で
iconv_open() 〜 iconv_close() までの処理を書いてみたら
そこでも「Invalid argument」になってしまいました。
だんだんワケがわからなくなってきました…orz

>>546
ありがとうございます。やってみます。
(実はstrace自体知らなかったりしますが…)

548:542
05/07/17 14:53:40
straceの結果、下のような行がありました。
open("/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/gconv/gconv-modules", O_RDONLY) = -1 ENOENT (No such file or directory)

動かないほうのプログラムを調べてみると、サーバプログラムなので
実行ユーザのホームにchroot()していました。試しにchrootしている
箇所をコメントアウトしたら正常に動作しました。

問題の原因は解ったのですが、iconv()を使用するプログラムでは
chrootしてはいけないということになるのでしょうか?セキュリティの
関係でここはchrootしておきたいのですが、何か良い解決策はない
ものでしょうか。

549:デフォルトの名無しさん
05/07/17 14:57:56
chrootした先にも必要なもの一式そろえてあげればいいのでは。

550:デフォルトの名無しさん
05/07/17 15:33:21
>>548
chrootの意味わかってるか?


551:542
05/07/17 15:35:38
>>549
ホームディレクトリを基点に/usr/lib/gconvのディレクトリを掘って
丸ごとコピーしたら動きました。ありがとうございます。

552:デフォルトの名無しさん
05/07/17 15:39:15
ソースをざっと見ただけだけどchrootの前に一回iconvを呼べばそれは必要ない気がする。

553:542
05/07/17 15:49:42
>>550
一応解っていたつもりだったのですが、iconv_open()などの
内部で行われる動作についてはなんとなく例外のような感じが
していました…

>>552
最初に生成した変換ディスクリプタを使いまわすということでしょうか。
うまく行きそうな気がするのですが、ちょっと構造が大きく変わってしまうので
別の機会に試してみたいと思います。

554:デフォルトの名無しさん
05/07/17 15:58:15
そうじゃなくて、gconvは最初に呼ばれたときに一回だけgconv-modulesを読み込んで
初期化して、それ以降はファイルアクセスしないみたいだから。

555:542
05/07/17 16:58:39
>>554
確かに>>548のエラーもログの中で一度しかでていませんでした。
仰るとおりchrootの前にiconv_open()→iconv_close()だけ実行したら
コピーしたファイル無しでも問題なく動作しました。

これで全てすっきりです。
ご回答いただいた方々、本当にありがとうございました。

556:デフォルトの名無しさん
05/07/17 20:02:05
このスレやっぱスゲー

557:デフォルトの名無しさん
05/07/17 20:48:13
どの辺がすごいのかよくわからないのだが
ム板のほうが深い話できるだろ

558:デフォルトの名無しさん
05/07/17 23:05:32
根拠がソースだけだと気持ち悪いのでマニュアルの記述を探してきた。
英語を面倒がらず、ソース読む前にマニュアルを読むべきだったな。>自分
URLリンク(www.gnu.org)
> 6.5.4.1 Format of gconv-modules files
> ...
> At the first call of the iconv_open function the program reads all available
> gconv-modules files and builds up two tables: one containing all the known
> aliases and another that contains the information about the conversions and
> which shared object implements them.

559: ◆AE4dNGZqMw
05/07/21 07:09:48
ちょっと愚痴らせてくれや
コンソールでscreen使ってソース書いてたんだけど
Xlibを使ったコードだったから、実験するためにtwm立ち上げて
そこでscreenをデタッチしてkterm上で実行してみたわけよ、でもなぜか
セグフォるの、調べてみたら
color_black = BlackPixel( disp, 0);
これでセグフォる
どう考えてもセグフォる部分じゃない
3時間ものすごい頭使って今まで考えたわけよ
pika−−−−−−−−−−nn!!!!!!!
もしかして、screenをデタッチしてやったからコンソールのときのなんかの変数受け継いでるのかな?
で、あたらしくkterm立ち上げてashで生で実行
‥‥‥‥‥‥‥‥‥‥
いけた‥‥‥‥
ほんと、今までの3時間なんだったんだろう‥‥


ごめん、 どうしても誰かにいいたかったの‥‥

560:デフォルトの名無しさん
05/07/21 07:33:36
あるマニュアル読んでたら
フォント名はコードに直書きするんじゃなくて
.Xresourcesに書けって書いてあるんだけど
なんで? 指定フォントの決め打ちなのにわざわざ書かせなきゃいけないの?

ってか、どうやって読み込めってんだよ


561:デフォルトの名無しさん
05/07/21 09:31:59
再コンパイルすることなく、
カスタマイズすることができる

562:デフォルトの名無しさん
05/07/21 09:45:40
>>559
環境変数を確認するのはことXWindowに関しては常道。

>>560
おまいさんもXWindowに関して基礎から勉強し直した方が…

563:デフォルトの名無しさん
05/07/21 10:58:37
XWindowの基礎なんて勉強しても無駄になることうけあい

564:デフォルトの名無しさん
05/07/21 11:09:11
身に付けて無駄になる基礎なんてない。

565:デフォルトの名無しさん
05/07/21 11:24:32
Xを使う以上、基本はXを知ることだと思うんだけど
Xの知識が無駄になるってどういうことなの?
また違うWindowSystem誰か作ったの?

566:560
05/07/21 11:46:10
ありがと

でも決め打ちだよ?
そのフォントじゃないと正しく動作しないの
それでも、やれっていうの?

567:デフォルトの名無しさん
05/07/21 12:07:51
今使ってるフォントに問題が発覚して
正しく動作する別のフォントに入れ替える必要が出てくるかもしれない。
とかね。

べつにローカルな使用だけでソースが手元にあって
いつでもコンパイルできるならなんでもいんじゃね?

568:デフォルトの名無しさん
05/07/21 12:29:23
>>565
「Xの仕事が無い」というだけのこと

569:565
05/07/21 19:43:12
お前らの人生全て仕事なんだ・・・
寂しいね

570:デフォルトの名無しさん
05/07/21 20:53:19
>>569
お、俺を一緒にするなよな? な?

571:デフォルトの名無しさん
05/07/21 21:11:20
うーん
でも仕事以外にXって使わないからなぁ・・・

572:デフォルトの名無しさん
05/07/21 21:58:54
家ではWindows使ってるって事?

573:デフォルトの名無しさん
05/07/22 07:56:56
>>559
> もしかして、screenをデタッチしてやったからコンソールのときのなんかの変数受け継いでるのかな?

「もしかして」じゃなくて調べろよ。

for i in `env | awk -F= '{ print $1 }'`; do (unset "$i"; ./a.out); done

どうせ全然違う原因だと思うが。

574:デフォルトの名無しさん
05/07/22 08:36:40
なにがしたいのかがまったくわからん

575:デフォルトの名無しさん
05/07/22 22:48:34
単に XOpenDisplay() に失敗していたけどエラーチェックして
なくて、disp == NULL で落ちてたってだけじゃないの?


576:デフォルトの名無しさん
05/07/30 11:01:11
C/C++質問スレから誘導されてきました。

子プロセスの標準出力と標準エラー出力を親プロセスで取りたいのですが、
たまに出力を取る部分で止まってしまいます。fgetsしているところで止まっている
ので、eofがくるまで待っているのか、とも思っているのですが・・・。

子プロセスの標準出力と標準エラー出力を別に取りたいので、forkしてパイプを
つなげる必要があると認識しています。

テストでつかったソースは以下のアップローダにupしました。

URLリンク(kansai2channeler.hp.infoseek.co.jp)

#main関数内で起動用のコマンド文字列を作っているのですが、
#このソースでは省略しています。

このような時、どうすればよいのでしょうか。どなたかご教授ください。

577:デフォルトの名無しさん
05/07/30 12:05:12
子側でstderrのバッファが満杯になってブロックされてんじゃないの?

578:デフォルトの名無しさん
05/07/30 12:19:30
selectかスレッドを使って読み出せ。

579:576
05/07/30 12:55:27
アドバイスありがとうございます。

> 577さん
バッファが満杯でブロックされてる場合は578さんが書いているように
1.スレッドで満杯になる前に逐次読み出してやる
2.selectでタイムアウトを設定する
という形でしょうか。

> 578さん
スレッドはぱっと調べた結果、手に負えそうもないので、selectについて調べてみました。
selectはファイルディスクリプタが読み書き可能になるまで待機して、準備できた場合は
1以上を返す、という理解でよろしいのでしょうか。

#上記のブロックされた場合はタイムアウトでbreakする?

selectを使って色々いじってみます。

580:デフォルトの名無しさん
05/07/30 14:49:47
select(2)やってみる前に、
とりあえずstrace -p PIDを全てに試してみたらどうなのよ?
# Solarisだとtruss

ありがちなのが、bugで誰も書いてないpipeを読んでいるケース。

581:576
05/07/30 19:23:22
> 580さん
straceですか。そのようなコマンドがあることは知りませんでした。

#ものすごい今更ですが、Linux/gcc環境なので
#straceで使えました。

早速実行してみた結果、以下のように・・・

$ strace -p 19592
write(2, "書き込みメッセージ・・・"..., 46

$ strace -p 19590
read(3,

もしかして580さんの仰るとおり読み出すpipeが違うのでしょうか。デバッグライト
では、子プロセスの書き込み先は対になる4だったのですが・・・。
メッセージを読み出せる場合の方が多かったので油断していました。

582:デフォルトの名無しさん
05/07/30 19:37:43
>>581
>>579の時点で妥当な結論が出ているので580はさくっと無視するのが吉。
どうせあなたのプログラムも読んでない。



583:デフォルトの名無しさん
05/08/02 11:54:06
kernel2.6系で、システムコールをフックする方法を教えて下さい。

このページには2.4での方法が書いてありますが、2.6ではうまくいかないです。
URLリンク(www.atmarkit.co.jp)


上のページと同じように、sys_unameをフックするソースを晒して下さい!!

584:デフォルトの名無しさん
05/08/02 11:58:37
それくらい自分で調べられないお子ちゃまはおいたしちゃダメ。


585:デフォルトの名無しさん
05/08/02 12:37:43
>>583
LKM rootkit のソース読めばいいじゃん。

586:デフォルトの名無しさん
05/08/02 17:30:35
>> 585

kernel2.6では、結構大変そう。。。
カーネルのバージョン毎にrootkitの対応状況が異なる。

最新版カーネルで、フック&晒しよろろ。

2.6全般のシステムコールをフックするrootkitがあれば、教えてください。

587:デフォルトの名無しさん
05/08/02 19:24:43
>>586
いや、だから自分で読めよ。

588:デフォルトの名無しさん
05/08/04 02:23:45
>>586

straceは、すべて(!?)のシステムコールをフックしてるんじゃないか?

よくしらんがね。

589:デフォルトの名無しさん
05/08/04 15:55:42
このスレッドの576で質問させていただいたものですが、また
お知恵を拝借させていただけないでしょうか。

SolarisとLinuxではforkしてexeclpしたときの振る舞いが違う、
という現象で悩んでいたのですが、どうやらshの違いではないかと
いうところまで突き止めました。

Linuxの場合、shはbashのシンボリックリンクになっていて、-cでコマンド
起動をするとpidはshと同一になるのですが、Solarisですとshとコマンドが
別のpidになります。

Solarisではforkの返り値のpidでkillしてもコマンドは別pidなので殺せない
ようなのです。

Solarisのshでbashと同じ動作をさせるか、何とかして孫(sh->コマンド)のpid
を取ってきてkillする方法はありませんでしょうか?。

> 582さん
アドバイスありがとうございます。selectでうまく動作させることができました。

#まとめをUPしようかとも思ったのですが、2chでは一般的ではない行為です?

590:デフォルトの名無しさん
05/08/04 16:09:35
>>589
いろいろ方法はないではないけどね。
ps出力相当の情報を拾ってきて、ppidがshのpidのプロセスを探すとか。
そもそも、なんでexeclp()でshを動かすのかが問題かな。
シェルを経由しないで直接動かせばいいじゃんと思うわけだ。
killハンドラで子供を殺すプロセスを中継に使うって手もあると思うし。
#まとめは歓迎。この件だけでもこのスレ全部でも、すきなだけやっちゃってくださいw
##で、アップロードはアップローダかどこかに。

591:デフォルトの名無しさん
05/08/04 17:39:38
>>588
んなことはない。
共通の入口と出口を抑えているだけでつ。

592:デフォルトの名無しさん
05/08/04 21:50:42
>>591
ltraceなんかは純然たるwrapperだわな。

>>589
sh -c 'exec command args'してみれば?

593:デフォルトの名無しさん
05/08/05 16:12:11
>>589
fork() したら、子プロセスの最初で setsid()して新しいセッション/プロセスグループを作成する。
こうすると kill(-pid, SIGTERM)とかでそのプロセスグループに対して killすることがでけるよ。

こんな感じ

  child = fork();
  if (child == 0) {
    setsid();
    execlp(〜);
  }

  〜〜
  kill(-child, SIGTERM);

自作アプリで Firefoxをexec、killしたい時にやりました。


594:デフォルトの名無しさん
05/08/05 17:10:50
>>592
ltraceはwrapperじゃないよ。
stepモードで実行して、libcの関数の先頭アドレスにjumpした瞬間を拾って
スタック先頭から引数を拾って表示している。だから死ぬほど遅い。

wrapperにすると可変長引数に対応できないからな。

595:デフォルトの名無しさん
05/08/07 02:07:29
現在実行している環境が32ビットか64ビットか判別する方法を教えてください。

596:デフォルトの名無しさん
05/08/07 02:29:14
>>595
すべてのUNIXで共通して判別できる方法はありません

597:デフォルトの名無しさん
05/08/07 02:36:17
>>595
intの最大値を調べてみたら?

598:デフォルトの名無しさん
05/08/07 02:38:21
ILP64かもしれないし

599:デフォルトの名無しさん
05/08/07 02:39:03
違った
LP64かもしれないし(つーか普通そう)

600:デフォルトの名無しさん
05/08/07 03:16:51
sizeof(void*)
sizeof(long)
sizeof(int)
の結果を見て好きなように解釈すれ

601:デフォルトの名無しさん
05/08/07 03:22:37
お前らアホか?
CPUのことだろ?
dmesgでCPUみたらいいだろ

602:デフォルトの名無しさん
05/08/07 03:26:28
スレのテーマ的には実行中のプログラムが自分で判断する方法ということでは?

603:デフォルトの名無しさん
05/08/07 03:27:20
>>595
実行してる環境の「何が」32ビットか64ビットかによって判定法が異なる。

604:デフォルトの名無しさん
05/08/07 03:55:47
目的に応じてautoconfのマクロを自分で書けばよかろ


605:デフォルトの名無しさん
05/08/07 04:34:51
>>601
OSが64bitであろうと32bitであろうと、
実行環境のbit数は関係ないだろう。emulatorかもしれないんだし。

606:デフォルトの名無しさん
05/08/07 12:28:22
>>601
そもそも dmesg が入っているとは限らない。


607:デフォルトの名無しさん
05/08/07 12:47:21
uname -aはどうでしょう?

608:デフォルトの名無しさん
05/08/07 13:02:41
CPUを見ても32bitか64bitかなんて決定できないだろ。
両方のバイナリを実行できるOSもあるし。
>>600,603あたりがFAじゃねーの。


609:デフォルトの名無しさん
05/08/07 13:06:00
なんで600が?

610:デフォルトの名無しさん
05/08/07 13:16:35
>>609
結局603を間がえたあと
URLリンク(www.opengroup.org)
見たいな感じで600のようなことをすることになるわけで。

611:デフォルトの名無しさん
05/08/07 14:11:01
select() システムコールはどのような時に使用するのでしょうか?
簡単な解説があるサイトを紹介していただいても結構です。


612:デフォルトの名無しさん
05/08/07 14:13:02
URLリンク(www.linux.or.jp)

613:sage
05/08/07 14:17:31
ありがとうございます。
例をもとに、動作検証してみます。

614:デフォルトの名無しさん
05/08/07 14:18:12
>>611
ひとつのスレッドで同時に複数I/Oを実行したいとい

615:sage
05/08/07 14:37:06
ありがとうございます。>> 614
サンプルとか例などはありませんでしょうか?

616:デフォルトの名無しさん
05/08/07 14:45:35
URLリンク(www.linux.or.jp)

617:デフォルトの名無しさん
05/08/07 14:51:05
selectの掟とかあって、難しそうですが、
理解できるように努力してみます。
ありがとうございました。>> 614 616

618:デフォルトの名無しさん
05/08/07 17:05:00
ファイルからの入力を監視しつつ標準入力を受け付けるような応用はselect()で事が足りるね。

619:デフォルトの名無しさん
05/08/07 18:12:18
ファイルからの入力はselectしなくてもいつでも読み出し可能だろ

620:デフォルトの名無しさん
05/08/07 18:32:31
nfsやgmailfsでも?

621:デフォルトの名無しさん
05/08/07 19:12:58
>>620
理論上は

622:デフォルトの名無しさん
05/08/07 19:35:42
readがブロックすることと、readに時間がかかるのは別。

623:618
05/08/07 20:18:08
>>619
tail -f相当しながら標準入力をファイルに書き出すプロセスを実際に作った経験で書いたんだけど。

624:デフォルトの名無しさん
05/08/07 20:54:12
tail -f相当って普通に考えて現在のファイル末尾まで
読んだらEOF返るだろ
select()しても無駄なんじゃないの
そのへぼプログラムはポータブルに動くのか?

625:デフォルトの名無しさん
05/08/07 21:09:09
そうなんだ
ファイルがまだcloseしてないときでも
EOFが帰るのか
ちょっと試してみるか

626:618
05/08/07 21:14:50
>>624
いや、標準入力はEOFにならないんだけど。

627:デフォルトの名無しさん
05/08/07 21:35:00
なんか618がかわいそうになってきた。

628:デフォルトの名無しさん
05/08/07 21:41:54
>>627
いや、>>619>>618が戦ってるだけだろ
>>618が標準入力とファイルを読む という話をしているのに対して
>>619がファイルは云々と標準入力のことを棚上げして
以降話がかみ合わないままなんだよ

629:デフォルトの名無しさん
05/08/07 21:48:25
>>626
標準入力はEOFにならないとしてもファイルはEOFになるんじゃないの?
一度EOFまで達したファイルディスクリプタって
その後書き込みがあったときに読み込み可能になるの?
標準入力はselectで待てるけど、ファイルは最後まで読み切ったら
selectのタイムアウト後に自分でseekしてみるしかないんじゃなくて?
それは別々な処理だし、selectで待つとは言い切れないんじゃない?

630:デフォルトの名無しさん
05/08/07 21:52:40
>>624
一旦EOFを返しても、そのファイルが拡大されれば、
その後のread(2)でデータが読める。select(2)もOK。
この仕様は4BSDが始めた。(たしかtail -fのために)

その頃のSystem Vは駄目だったけど、今これがダメなUNIXはないと思う。
www.opengroup.orgあたりはどういう風に言及しているのかな。

631:デフォルトの名無しさん
05/08/07 22:00:00
拡大されるまでは無限ループし続けるのか
そりゃずいぶんな実装だなw

632:630
05/08/07 22:08:03
GNUのtailなんかは再チェックのsleep時間を指定可能。

最近のUNIXはfile notificationがあるので、
(fcntl(2)のF_NOTIFY&DN_MODIFY)
こっちを使えば、いい場合もあるけど。(tail -fではみたことないけどね)

633:デフォルトの名無しさん
05/08/07 22:09:28
結局select()でtail -fを実装できないのは同じだな
どんなプログラムだったんだろう・・・見てみたい

634:デフォルトの名無しさん
05/08/07 22:18:15
>>632
EOFに達してもselect抜けるよね
EOFに達したあと、再度selectにつっこんだら
拡大されるまではブロックされるの?

635:デフォルトの名無しさん
05/08/07 23:16:39
まぁ最近じゃ tail -f は sleep なんかせずに kqueue を使って
スマートに実装されてる訳だが。

636:デフォルトの名無しさん
05/08/07 23:42:36
tail.c
URLリンク(www.freebsd.org)

637:デフォルトの名無しさん
05/08/07 23:57:54
該当部分はこっちだろ。
tail/forward.c
URLリンク(www.freebsd.org)

638:デフォルトの名無しさん
05/08/08 00:57:00
makefileの書き方で質問です。
makefileのあるディレクトリの下に、
Aというサブディレクトリと、Bというサブディレクトリがあり、
ここのサブディレクトリにもそれぞれmakefileがあります。
このとき、親ディレクトリからAとBの両方を一度にメイクするには
どのように書けば良いのでしょうか。

よく他人の作ったプログラムやLinuxのカーネルをメイクすると、
入ります ディレクトリ xxx
出ます ディレクトリ xxx
というような表示が出るのですが、その方法を教えてほしいです。

639:デフォルトの名無しさん
05/08/08 00:57:55
echoコマンドつかってるんじゃね?

640:デフォルトの名無しさん
05/08/08 01:02:24
>>638 make -C
スレリンク(tech板)

641:618
05/08/08 02:45:52
最早恥晒しにしかならないみたいだけれど、一応概略のみ。
--
FILE * fp = fopen(file, "r");
fseek(fp, 0, SEEK_END);
for (;;) {
if (fgets(fp)) {
/* tail -f相当 */
}
FD_SET(0);
select();
if (rtn > 0) {
if (FD_ISSET(0)) {
if (!fgets(stdin)) {
break;
}
/* ファイルに書き出す */
}
--
実際にはこれにmsgが絡んでもう少し複雑。

642:デフォルトの名無しさん
05/08/08 10:08:29
stdioとselectは混ぜるな危険。
バッファには先読みされてるがselectでは空という場合もあるぞ。

643:デフォルトの名無しさん
05/08/08 10:10:12
正直、>>618には失望した

644:デフォルトの名無しさん
05/08/08 13:22:16
setvbuf(f, _IONBF)やfflush()と併用すれば安全に使える状況も多い。
fscanf()あたりと使うのは絶望的。

645:618
05/08/08 18:52:10
失望されちった。

流石に標準入力は実際にはfgets()してません。
バッファリングしない一行入力関数を作ってそれを呼んでます。
#だから概略なんだってば。

646:デフォルトの名無しさん
05/08/08 20:04:39
FreeBSDまたはLinuxでpthreadを使用してメインスレッドとサブスレッド内で
sleep(3)を使おうと思ってるのですが、sleep(3)はスレッドセーフですか?
man(FreeBSDとLinuxの両方)を見たけどその記述が見つかりませんでした。

647:デフォルトの名無しさん
05/08/08 20:07:56
駄目だよ。SIGALRM使っているから。select(2)使いな。

648:デフォルトの名無しさん
05/08/09 01:20:09
>>647
SIGALRMでsleep(3)実装ってどんな化石OSの話でつか。

649:デフォルトの名無しさん
05/08/09 01:41:57
>>648
( ゚д゚) ポカーン


(´-`).。oO(わからないなら黙ってればいいのに…)

650:デフォルトの名無しさん
05/08/09 02:55:14
GUIプログラミングを学びたいのですが、どこから始めればいいでしょうか。
レベルはK&Rを読了です。


651:デフォルトの名無しさん
05/08/09 03:07:35
>>649
( ゚д゚) ポカーン
thread safeにするため最近のOSじゃalarmは軒並みnanosleepで実装されてるよ。

(´-`).。oO(じじいはひっこんでりゃいいのに…)

652:デフォルトの名無しさん
05/08/09 03:08:54
alarmじゃねえ、sleepだ。
大事なところで噛んだ。ちきしょう。

653:デフォルトの名無しさん
05/08/09 08:08:50
>>650
Xorg のソースあたりから

654:デフォルトの名無しさん
05/08/09 08:20:58
Cしか知らんのならXtかGTKのチュートリアルくらいしかGUIへのとっかかりは
ないんじゃないか?


655:デフォルトの名無しさん
05/08/09 08:46:06
Open Groupはsleep(3)のSIGALRMによる実装を許容。
URLリンク(www.opengroup.org)
ポータブルにしたいなら、sleep(3)は使わない方がいいね。

656:デフォルトの名無しさん
05/08/09 13:11:11
UNIXドメインソケットをつくってbindしたときにできる
ソケットファイルのパーミッションは 何で指定するの?
あとから 777 に変えたいときはどうしたらいいの?
system("chmod a+rw hoge");はかっこわるくてもうヤ

657:デフォルトの名無しさん
05/08/09 13:20:24
後からかえたいなら、fchmod(fd, 0777)。
出来ると同時に指定したいときは、umask(0)。
パーミッションを落すわけじゃないから、後でいいだろうね。


658:デフォルトの名無しさん
05/08/09 13:49:28
>>656
かっこ悪いというより、頭悪いな。

659:デフォルトの名無しさん
05/08/09 16:43:40
>>651
ようするに最近のOSはsleep(3)がスレッドセーフで実装されてるってことか?

660:デフォルトの名無しさん
05/08/09 21:39:20
>>659
つまりnanosleepで実装されてれば○。alarmで実装されてたら×。
移植性高めたいならselect使えということ。

661:デフォルトの名無しさん
05/08/09 22:09:01
nanosleep呼ぶ手も有ると思うが。

662:デフォルトの名無しさん
05/08/09 22:13:29
それでわざわざこんなこと書いてるのか
URLリンク(www.kt.rim.or.jp)

663:デフォルトの名無しさん
05/08/09 23:16:37
Winsockの流儀と移植性は別問題

664:デフォルトの名無しさん
05/08/10 00:23:08
>>660
usleep()で実装されていても駄目(な可能性がある)。

nanosleep()は、signal non-intrusiveであることが保証されている。
URLリンク(www.opengroup.org)
nanosleep()はPOSIXリアルタイム拡張。

665:デフォルトの名無しさん
05/08/10 01:07:24
FreeBSDやLinux等が今現在、どういう風に実装していようが、
やっぱ、Pthreadを使用してsleepしたいならselectかpollを使用するのが無難だな。
sleep(3)は、過去(pthreadが無い時代)の物との互換性維持の為にあるようなもんだろ。

666:デフォルトの名無しさん
05/08/10 02:11:22
POSIXのリアルタイム拡張か、出来ればアドバンスドリアルタイム拡張がないと、
pthread的には現代的なAPI設計とは言いがたいからね。

667:デフォルトの名無しさん
05/08/10 06:46:30
>>663
そもそもここUNIXスレだしな
WinsockならSleepが確実にあるはずだからそれ使えというのも分かるけど

668:デフォルトの名無しさん
05/08/10 09:11:37
>>662
それのさ、BSDソケット版というかUNIX版?みたいな感じのやつはある?

669:デフォルトの名無しさん
05/08/10 09:38:00
>>668
ネットワークプログラミングスレのテンプレへGO!

670:デフォルトの名無しさん
05/08/10 09:47:13
ptyの使い方を解説したページってある?

671:デフォルトの名無しさん
05/08/10 10:19:55
>>670
URLリンク(www.sony.co.jp)
あとはStevens本とか。


672:デフォルトの名無しさん
05/08/10 11:07:46
>>670
script(1)のソース。
URLリンク(svn.clkao.org)

673:デフォルトの名無しさん
05/08/10 11:08:50
それからopenpty(3)を使うこt。

674:デフォルトの名無しさん
05/08/10 22:38:25
errnoに自分で使う値を加えたいんですが、システムのerrnoと
値が衝突しないような方法はないでしょうか

675:デフォルトの名無しさん
05/08/10 22:41:11
ありません

676:デフォルトの名無しさん
05/08/10 23:06:02
大体、errnoに代入できるとは限らない。
関数呼び出しの可能性がある。with pthreadの場合。

URLリンク(www.opengroup.org)

677:デフォルトの名無しさん
05/08/11 00:42:57
左辺値に展開される関数だからどっちにしても代入できるだろ

678:デフォルトの名無しさん
05/08/11 01:29:24
>>676
そんなこといったら読み出しだって保証されませんよ?

679:デフォルトの名無しさん
05/08/11 11:16:56
誰も何も保障してくれないのか

680:デフォルトの名無しさん
05/08/11 12:16:26
誰も何も保障してくれない事は保障します

681:デフォルトの名無しさん
05/08/11 12:49:48
URLリンク(linas.org)
このページの要約お願いします

682:デフォルトの名無しさん
05/08/11 13:37:17
嫌です

683:デフォルトの名無しさん
05/08/11 18:06:23
Cursesとかで現在カーソルのある座標を取得する関数とかありませんか?調べていますがなかなか見つからない

684:デフォルトの名無しさん
05/08/11 18:07:24
>>683
環境はLinux、GCCです

685:デフォルトの名無しさん
05/08/11 18:10:28
>>683
マルチは氏ね

686:デフォルトの名無しさん
05/08/11 18:18:04
>>684=683
向こうに挨拶くらいしてから移動しろ。
cursesには現在座標を取得する関数は確かないから、
自前でどこにあるかを追跡し続ける必要があったと思う。
つーか、目的が判らんからそれ以上はなんとも言えん。

687:デフォルトの名無しさん
05/08/11 18:46:22
Linuxならncurses
getyxだろ?

688:デフォルトの名無しさん
05/08/11 18:54:31
cursesってまだ存在してるの?
正気?

689:デフォルトの名無しさん
05/08/11 19:13:10
>>688
aho

690:デフォルトの名無しさん
05/08/11 20:54:35
>>686
>>687
ありがとうございます。勉強になりました。
ファイラーを作ろうとしているのですがカーソルを押したときに座標を読み取ってどのファイルが選択されているかをチェックしようとしていました。試してみます。



691:デフォルトの名無しさん
05/08/11 21:34:45
>>688
え? Solaris ではデフォルトだけど。

692:デフォルトの名無しさん
05/08/12 00:42:13
実はマウスポインタの座標が欲しいんだったりしてw

693:デフォルトの名無しさん
05/08/12 02:20:28
ncursesならマウスも扱えるぜー!!!

694:デフォルトの名無しさん
05/08/13 15:56:40
メールの送信日時の欄にJSTなどのタイムゾーンが付加されますが
このタイムゾーンの文字列の取得方法を教えてください。



695:デフォルトの名無しさん
05/08/13 16:18:36
>>694
正規表現で抜けばいいんでないの?

696:デフォルトの名無しさん
05/08/13 17:39:22
>>694
time_t t = 1116908090;
printf("%s\n",localtime(&t)->tm_zone);

697:デフォルトの名無しさん
05/08/14 00:32:09
リモートコンピュータのCPU使用率の取得方法を教えてください。

698:デフォルトの名無しさん
05/08/14 01:28:55
>>697
リモート側でrstatd動かすとかsnmp使うとか


699:デフォルトの名無しさん
05/08/14 12:12:00
Cのプログラムで、
UNIX上で、とあるコマンドをどのユーザーが発行しても同一ユーザーが
発行しているようにさせたいのですが、どのようにすればいいのでしょうか?

自分で思いつくところだと、コマンドを発行させたいユーザが起動するデーモン
プログラムに、その他ユーザーが発行要求を投げて。デーモンはそれをSystem関数やら
何やらで発行して結果を返す。という感じで考えているのですが、
他に妙案ってありますでしょうか。

文章力無くてすみません


700:デフォルトの名無しさん
05/08/14 12:25:41
man chmod

701:699
05/08/14 12:44:24
>>700

返信ありがとうございます。
実行権を与える、というわけではなくてA、Xとユーザーが存在するならば、

Aがxxxを実行 →psで見るとxxxをAが実行していることになっている。
これを、
Xはxxx_daemonを起動しておく
Aがxxx_daemonを実行 → xxx_daemonからxxxをコール →psで見るとxxxをXが実行していることになっている。

という事がしたいのです。


702:デフォルトの名無しさん
05/08/14 13:44:30
man setuid

703:699
05/08/14 14:23:17
>>702
ありがとうございます。setuid使えばなんとかなりそうです。
お騒がせしましてすみませんでした。



704:デフォルトの名無しさん
05/08/15 09:42:45
プログラム上からディレクトリを作成する方法を教えてください


705:デフォルトの名無しさん
05/08/15 09:53:02
mkdir(2)

706:669
05/08/15 23:38:03
度々すみません。
早速レス頂いたとおりchmod ug+sでモジュールに権限つけたら上手くいったのですが、
該当モジュールがシェルで、中でコマンド発行している場合はユーザが元のユーザで実行
している扱いになってしまいます。(man chmodでもそう書かれていたのですが)。
これを回避する方法ってありますでしょうか?



707:デフォルトの名無しさん
05/08/16 00:02:38
なんで派生して自分で考えようとは思わないの?
ってかなんでそっちなんだ?

708:デフォルトの名無しさん
05/08/16 01:21:32
man setuid

709:デフォルトの名無しさん
05/08/16 10:12:28
C言語で現在の時間を変更する関数を教えてください

710:デフォルトの名無しさん
05/08/16 10:17:02
settimeofday


711:デフォルトの名無しさん
05/08/16 10:18:30
man man

712:デフォルトの名無しさん
05/08/16 10:21:46
>>709
限りなく光速に近い速度で移動する

713:デフォルトの名無しさん
05/08/16 10:40:23
co というコマンドの使い方を教えてください

714:デフォルトの名無しさん
05/08/16 10:50:35
まずci

715:デフォルトの名無しさん
05/08/16 12:34:42
>>713
man co だろ。はいはいワロスエロス

716:デフォルトの名無しさん
05/08/16 14:47:45
>>713
限りなくco速に近い速度で移動する

717:デフォルトの名無しさん
05/08/16 15:56:27
そんなco息な答えを

718:デフォルトの名無しさん
05/08/16 22:16:53
coこはくだ質なインターネッツですね

719:669
05/08/17 00:10:13
>>707
>>708

結局所有者rootのCモジュールにug+s、で、その中でsetuidしてsystem関数をコールさせることで
落ち着きました・・・まだ実機で確認取れてないんですが(汗

アドバイスありがとうございました(感謝


720:デフォルトの名無しさん
05/08/17 01:45:51
>>719
まぁそういう場合はsudo使うと楽なのだが。

721:デフォルトの名無しさん
05/08/17 10:22:21
make clean:
に、rm *.oと書いているんですが、
*.oがひとつもない時はエラーになってしまいます。
エラーを出さないようにするにはどうしたらいいんですか?


722:デフォルトの名無しさん
05/08/17 10:26:16
-rm
rm -f

723:デフォルトの名無しさん
05/08/17 12:17:02
山ほどあるほかのソフトでどうやってるかというのを見る気はないのか


724:デフォルトの名無しさん
05/08/17 21:04:09
山ほどゴミコマンド作って悲しくないのか

725:デフォルトの名無しさん
05/08/17 21:37:44
/usr/local以下にある限り問題ない


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5387日前に更新/207 KB
担当:undef