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
探検
UNIXプログラミング質問すれ Part10
■ このスレッドは過去ログ倉庫に格納されています
1unco ◆manko/yek.
2011/04/18(月) 17:06:36.77574デフォルトの名無しさん
2013/10/23(水) 08:11:05.93 >>573
どのファイルシステムの話をしてんだよ。
どのファイルシステムの話をしてんだよ。
575デフォルトの名無しさん
2013/10/23(水) 09:04:19.27 環境は MacOS10.7 ファイルシステムは HFS+ ですが
ファイルシステムによって開き方が違うんですか?
ファイルシステムによって開き方が違うんですか?
576デフォルトの名無しさん
2013/10/23(水) 09:19:54.34 わかればよろしい
577デフォルトの名無しさん
2013/10/23(水) 10:02:16.47 >>575
http://www.wdic.org/w/TECH/%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AA%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF
extではファイルにならないこともある。これを利用して高速なロックファイルとする方法あったね。HFS+はわかんないや。
http://www.wdic.org/w/TECH/%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AA%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF
extではファイルにならないこともある。これを利用して高速なロックファイルとする方法あったね。HFS+はわかんないや。
578デフォルトの名無しさん
2013/11/02(土) 07:42:13.92579デフォルトの名無しさん
2014/03/04(火) 10:40:27.75 あらら随分と寂れちゃって
やっぱUNIX系でプログラムミングしようなんてヴァカは少ないんだろうな
やっぱUNIX系でプログラムミングしようなんてヴァカは少ないんだろうな
580デフォルトの名無しさん
2014/03/04(火) 10:44:38.16 馬鹿には無理
581デフォルトの名無しさん
2014/03/04(火) 12:47:00.64 「やっぱUNIX系でプログラムミングしようなんてヴァカ」という奴はいない
582デフォルトの名無しさん
2014/03/04(火) 13:49:03.30 >>579
んじゃ何でプログラミングするんだよ?
んじゃ何でプログラミングするんだよ?
583デフォルトの名無しさん
2014/03/05(水) 00:05:19.95 >>579
馬鹿には無理
馬鹿には無理
584デフォルトの名無しさん
2014/03/05(水) 03:25:53.72 わかればよろしい
585デフォルトの名無しさん
2014/03/07(金) 22:08:54.91 ユニックスでプログラミングとか真性のオタクだろw
586デフォルトの名無しさん
2014/03/08(土) 13:19:20.76 >>585
馬鹿には無理
馬鹿には無理
587デフォルトの名無しさん
2014/03/08(土) 14:07:00.70 まあプログラミング作業そのものはwin 上でおこなうけどな
588デフォルトの名無しさん
2014/03/10(月) 03:07:52.96 プログラミングする奴はゴロゴロいるけどプログラムミングはそうそういないな
589デフォルトの名無しさん
2014/03/10(月) 11:58:20.45 プログラムミングだからか、そりゃMinGWでやってりゃいらつくかもしれん
590デフォルトの名無しさん
2014/03/12(水) 19:32:04.52ID:cq0Wuml2 Program MinG
591デフォルトの名無しさん
2014/04/04(金) 11:37:49.40ID:+1zjSCgd 私は主にLinux上で、C/C++のプログラミングをするんですが、
Linux の システムコールや標準ライブラリ関数が、
スレッドセーフかどうかが公式マニュアル等には、
まず記述されていないことが多いです。
スレッドセーフでない関数をスレッドから使うと
おかしな動きになるんですが、
スレッドセーフかどうかがハッキリ記述されている例の方が
少ないです。
みなさんはどうしてますか?
Linux の システムコールや標準ライブラリ関数が、
スレッドセーフかどうかが公式マニュアル等には、
まず記述されていないことが多いです。
スレッドセーフでない関数をスレッドから使うと
おかしな動きになるんですが、
スレッドセーフかどうかがハッキリ記述されている例の方が
少ないです。
みなさんはどうしてますか?
592デフォルトの名無しさん
2014/04/04(金) 11:56:16.78ID:5os8VUT8 man pthreads
593デフォルトの名無しさん
2014/04/07(月) 00:41:04.44ID:JdSV9wAR システムコールはされてるだろ。glibcも。
594デフォルトの名無しさん
2014/04/08(火) 18:36:01.77ID:nqRQMd5J 質問です。
ネットワークAPIの略号はこんな感じでいいのでしょうか?
a : ascii
h : host
hs : host short
hl : host long
n : network or numeric
ns : network short
nl : network long
p : presentation (.で区切られたアドレスを文字列で表現)
aとpは同じ意味なのでしょうか?
nはnetworkと説明されていたり、numericと説明されているのですが、
どちらでもいいのでしょうか?
よろしくお願いいたいします。
ネットワークAPIの略号はこんな感じでいいのでしょうか?
a : ascii
h : host
hs : host short
hl : host long
n : network or numeric
ns : network short
nl : network long
p : presentation (.で区切られたアドレスを文字列で表現)
aとpは同じ意味なのでしょうか?
nはnetworkと説明されていたり、numericと説明されているのですが、
どちらでもいいのでしょうか?
よろしくお願いいたいします。
595デフォルトの名無しさん
2014/04/08(火) 19:06:15.00ID:XsPn59mL ???
596デフォルトの名無しさん
2014/04/08(火) 19:30:25.89ID:pfMGzHK8 >>594
まじれすすると
しいて言えばaがaddress、nがnetworkじゃ?
inet_addrとinet_networkがあるしな。
aがasciiじゃ使える文字の種類が多すぎだろw
aとpは、とりあえず関数の対応範囲が違う。
しかし、これがUNIX固有の話だと思ってここに書き込んだとしたらそれは間違いw
まじれすすると
しいて言えばaがaddress、nがnetworkじゃ?
inet_addrとinet_networkがあるしな。
aがasciiじゃ使える文字の種類が多すぎだろw
aとpは、とりあえず関数の対応範囲が違う。
しかし、これがUNIX固有の話だと思ってここに書き込んだとしたらそれは間違いw
597デフォルトの名無しさん
2014/04/08(火) 19:37:10.16ID:kcd9laA9 >>596
一部の英語ページでasciiだと書かれている所があったのでasciiだと思いました。
>aとpは、とりあえず関数の対応範囲が違う。
kwsk
>しかし、これがUNIX固有の話だと思ってここに書き込んだとしたらそれは間違いw
と言ってもUNIX発祥ですよね?
一部の英語ページでasciiだと書かれている所があったのでasciiだと思いました。
>aとpは、とりあえず関数の対応範囲が違う。
kwsk
>しかし、これがUNIX固有の話だと思ってここに書き込んだとしたらそれは間違いw
と言ってもUNIX発祥ですよね?
598デフォルトの名無しさん
2014/04/08(火) 19:55:39.16ID:pfMGzHK8599デフォルトの名無しさん
2014/04/09(水) 01:22:41.83ID:rnlf/mPK >>579
会社を探しても見つからないのでPHPを覚えることにした
会社を探しても見つからないのでPHPを覚えることにした
600デフォルトの名無しさん
2014/04/09(水) 09:01:14.53ID:e48Xi3NQ601デフォルトの名無しさん
2014/04/09(水) 09:32:21.34ID:5VEJdG+v わからないなら黙ってろよ
602デフォルトの名無しさん
2014/04/09(水) 09:57:21.51ID:e48Xi3NQ 適当なこと書くなよ
603デフォルトの名無しさん
2014/04/09(水) 10:55:51.16ID:Lfy0Xgry webはNeXTSTEP上で開発されたからでしょ。
604デフォルトの名無しさん
2014/04/09(水) 10:59:29.84ID:3Xcjw1HB ソースは?
605デフォルトの名無しさん
2014/04/09(水) 11:10:06.95ID:Lfy0Xgry606デフォルトの名無しさん
2014/04/09(水) 11:28:38.99ID:3Xcjw1HB ブラウザーか
607デフォルトの名無しさん
2014/04/09(水) 11:30:48.25ID:3Xcjw1HB サーバもそうだね、ごめん
608デフォルトの名無しさん
2014/04/09(水) 11:53:40.04ID:LRWrSFoo609デフォルトの名無しさん
2014/04/09(水) 12:45:03.71ID:Lf5xDRrs cern httpdにNextSTEPのコードが残ってるのかな?調べる元気はないが
ttp://www.w3.org/Daemon/
ttp://www.w3.org/Daemon/
610デフォルトの名無しさん
2014/04/09(水) 14:05:10.90ID:Ih8FRvRW aはBSD socket こっちがオリジナル
pはPOSIX
POSIXがpに変えた理由は分からん。atoi何かと共通でいいのにな。
>>609
NeXTSTEPで開発したと言っても、BSDシステムとして使ってるだけ。
ところどころNeXT亜種としてのifdefがある程度。
waitかwait3かwaitpidかとか。
pはPOSIX
POSIXがpに変えた理由は分からん。atoi何かと共通でいいのにな。
>>609
NeXTSTEPで開発したと言っても、BSDシステムとして使ってるだけ。
ところどころNeXT亜種としてのifdefがある程度。
waitかwait3かwaitpidかとか。
611デフォルトの名無しさん
2014/04/09(水) 14:32:24.39ID:ZHBwUHYP >>610
なるほど
なるほど
612デフォルトの名無しさん
2014/04/09(水) 14:34:12.02ID:yn/sF65z613デフォルトの名無しさん
2014/04/09(水) 15:46:27.04ID:i8e/a0RW614デフォルトの名無しさん
2014/04/10(木) 13:11:17.94ID:XJwbthao615デフォルトの名無しさん
2014/04/10(木) 13:49:44.14ID:TvL1VyED616デフォルトの名無しさん
2014/04/10(木) 14:09:32.07ID:UW8P9M5z617デフォルトの名無しさん
2014/04/10(木) 14:50:52.67ID:J/8goZVV >ウェブの質問をする場合はNeXTか?
ウェブといえばブラウザーの話な、これまめな
ウェブといえばブラウザーの話な、これまめな
618デフォルトの名無しさん
2014/04/10(木) 14:56:00.17ID:XJwbthao つまらないボケのつもりなのか何なのか。
619デフォルトの名無しさん
2014/04/10(木) 14:57:31.49ID:FMX8fFXB つかタダでさえ人減ってるのにいがみ合ってどうすんだよ
620デフォルトの名無しさん
2014/04/10(木) 14:58:53.83ID:HaZcfplR >>612
使ってたよ。今のiOSのCocoa Touchにあたるものが既にあったからね。
当時大学でNeXTが使えたので一応リアルタイムで遊んだ。
しかし「所詮ハイパーテキストだろ」、と思った俺に先見の明はまるでなかった。
Gopherでエロ画像を配布・収集することに精を出していたのはいい思い出
その後NeXTからWebObjectが発表されて、ただの静的なハイパーテキストから
動的なWebアプリの概念が発展していった、と理解している。
使ってたよ。今のiOSのCocoa Touchにあたるものが既にあったからね。
当時大学でNeXTが使えたので一応リアルタイムで遊んだ。
しかし「所詮ハイパーテキストだろ」、と思った俺に先見の明はまるでなかった。
Gopherでエロ画像を配布・収集することに精を出していたのはいい思い出
その後NeXTからWebObjectが発表されて、ただの静的なハイパーテキストから
動的なWebアプリの概念が発展していった、と理解している。
621デフォルトの名無しさん
2014/04/10(木) 15:47:15.93ID:J/8goZVV Mosaicからしか知らん
tp://ftp.ncsa.uiuc.edu/Mosaic/
tp://ftp.ncsa.uiuc.edu/Mosaic/
622デフォルトの名無しさん
2014/04/10(木) 16:45:24.84ID:A86XAulB そういやarchieを最後に使ったのがいつだったか思い出せないや
623デフォルトの名無しさん
2014/04/10(木) 20:58:27.68ID:CGLbGtu7 どこまでタイムスリップしたらwwwの創始者になれるかな。
624デフォルトの名無しさん
2014/04/10(木) 21:29:38.26ID:12EYUgzM www
625デフォルトの名無しさん
2014/04/11(金) 09:27:55.52ID:I+yNGwZi626デフォルトの名無しさん
2014/04/11(金) 10:02:34.34ID:F9N8K0IN627デフォルトの名無しさん
2014/04/11(金) 11:53:48.19ID:nfBS813s 今どき、サーバプログラムを作るときはどうするのがいいのかな
規模が小さいからxinetdで済ませたいんだけどそれでもいいんだろうか
規模が小さいからxinetdで済ませたいんだけどそれでもいいんだろうか
628デフォルトの名無しさん
2014/04/11(金) 13:01:29.58ID:31jcxzSz >>627
デーモンにするか、xinetd にするかは、
クライアント側からのアクセス頻度で決めるべき問題でしょ。
アクセス頻度が十分に多ければデーモンにすべきだし、
少なければ xinetd, inetd の方がいい。
デーモンにするか、xinetd にするかは、
クライアント側からのアクセス頻度で決めるべき問題でしょ。
アクセス頻度が十分に多ければデーモンにすべきだし、
少なければ xinetd, inetd の方がいい。
629デフォルトの名無しさん
2014/04/11(金) 17:18:05.86ID:aluZjTib 一般的に使われるものならinetdがないMac OS Xの事も考えてやってね。
代わりにlaunchdというのがある。
代わりにlaunchdというのがある。
630デフォルトの名無しさん
2014/04/12(土) 11:46:22.55ID:0X1ZzDgt ありがとう
inetd系でいくわ
inetd系でいくわ
631デフォルトの名無しさん
2014/04/12(土) 15:25:30.45ID:hH6WyNhq http://2;ch.sc/
632デフォルトの名無しさん
2014/04/12(土) 15:56:33.94ID:EgrmLH2O ひろゆきの宣伝うぜー。
10年前にあめぞうを荒らして2chに誘導したのと全く同じことをまたやろうとしてやがる。
全く変わらずクズだな、ひろゆき。
10年前にあめぞうを荒らして2chに誘導したのと全く同じことをまたやろうとしてやがる。
全く変わらずクズだな、ひろゆき。
633デフォルトの名無しさん
2014/04/12(土) 16:01:24.03ID:UapBJj1i なるほどね
また鯖おちたね
また鯖おちたね
634デフォルトの名無しさん
2014/04/30(水) 14:41:44.67ID:XBNt2TTL ----foo.sh----
#!/bin/sh
if [ bool処理 ];then
exit 0
else
exit 1
fi
----foo.c----
return = system("foo.sh");
if(WEXITSTATUS(return)){
シェルスクリプトでexit 0の時の処理
}else{
シェルスクリプトでexit 1の時の処理
}
このようにシェルスクリプトの終了ステータスで条件分岐したいのですが
いつもtrueになってしまいます。
どのようにすればいいでしょうか?
よろしくお願いします。
% uname
FreeBSD
#!/bin/sh
if [ bool処理 ];then
exit 0
else
exit 1
fi
----foo.c----
return = system("foo.sh");
if(WEXITSTATUS(return)){
シェルスクリプトでexit 0の時の処理
}else{
シェルスクリプトでexit 1の時の処理
}
このようにシェルスクリプトの終了ステータスで条件分岐したいのですが
いつもtrueになってしまいます。
どのようにすればいいでしょうか?
よろしくお願いします。
% uname
FreeBSD
635デフォルトの名無しさん
2014/04/30(水) 15:45:33.66ID:BnmcVkVe returnは予約語
WEXITSTATUSが非ゼロの場合のコメントが「exit 0の時」
実際に問題となったコードで出し直し
WEXITSTATUSが非ゼロの場合のコメントが「exit 0の時」
実際に問題となったコードで出し直し
636デフォルトの名無しさん
2014/04/30(水) 15:55:27.10ID:23BUNUOn637デフォルトの名無しさん
2014/04/30(水) 16:47:23.85ID:+76j8OJU t
638デフォルトの名無しさん
2014/04/30(水) 18:11:15.11ID:ZY5HChQC 馬鹿には無理
639デフォルトの名無しさん
2014/05/06(火) 12:51:39.88ID:OFsDJUcu Cで、標準入力と標準出力をひとつにして標準入出力としたい。
640デフォルトの名無しさん
2014/05/06(火) 13:49:59.83ID:5cOP3XrV すれば
641デフォルトの名無しさん
2014/05/06(火) 13:52:48.20ID:OFsDJUcu642デフォルトの名無しさん
2014/05/06(火) 17:09:21.31ID:R4LFdeTL unix ではプロセス間に生成されるパイプは基本リードまたはライトの一方向として生成されるからね‥‥
ふつうのディスクリプタのように双方向にすればいいのだが
ふつうのディスクリプタのように双方向にすればいいのだが
643デフォルトの名無しさん
2014/05/06(火) 18:55:48.96ID:G4//2ydq >>641
こういうことをしたいの?
#include <stdio.h>
main()
{
int x;
freopen("/dev/tty", "w+", stdin);
freopen("/dev/tty", "w+", stdout); // not used
fprintf(stdin, "enter a number:"); fflush(stdin);
fscanf(stdin,"%d", &x);
fprintf(stdin, "number is %d\n", x);
}
こういうことをしたいの?
#include <stdio.h>
main()
{
int x;
freopen("/dev/tty", "w+", stdin);
freopen("/dev/tty", "w+", stdout); // not used
fprintf(stdin, "enter a number:"); fflush(stdin);
fscanf(stdin,"%d", &x);
fprintf(stdin, "number is %d\n", x);
}
644デフォルトの名無しさん
2014/05/06(火) 19:01:55.55ID:G4//2ydq fprintf, fscanf じゃなく printf, scanf の方がよかったか
645デフォルトの名無しさん
2014/05/10(土) 14:44:23.71ID:W8dcXoh3 >>641
stdoutをfcloseしてから、fileno(stdin)をfdopenすればいい。
ただそれをstdoutとして使うのは処理系依存になる。
マルチスレッド対応のライブラリはstdoutに代入できなくなってるから。
fdreopenがあればいいのだが。
stdoutをfcloseしてから、fileno(stdin)をfdopenすればいい。
ただそれをstdoutとして使うのは処理系依存になる。
マルチスレッド対応のライブラリはstdoutに代入できなくなってるから。
fdreopenがあればいいのだが。
646デフォルトの名無しさん
2014/05/10(土) 16:08:42.04ID:S6+Ypxbi どういう使い方を想定していますか?
647デフォルトの名無しさん
2014/05/10(土) 20:31:33.38ID:XNOk+z7r648デフォルトの名無しさん
2014/05/10(土) 23:10:22.73ID:eu6ll0of >>647
意味ねーよ、たぶん。
意味ねーよ、たぶん。
649デフォルトの名無しさん
2014/05/11(日) 02:09:06.14ID:8Qasa1hM xinetdなんか使うときにほしいな
650デフォルトの名無しさん
2014/05/12(月) 15:49:13.01ID:iANYuL+Z651デフォルトの名無しさん
2014/05/12(月) 16:42:43.61ID:7oRV1ywD >>650
fdopenでなんとかなるっけ?
fdopenでなんとかなるっけ?
652デフォルトの名無しさん
2014/05/30(金) 18:57:46.01ID:1vuEEnaV OpenBSD の diff コマンドのソースを
src.tar.gz というアーカイブの /usr/bin/diff から持ってきて、
わずかに修正後、cygwin でビルドには成功し、一応動作はするのですが、
「diff: : Cannot allocate memory」
というエラーが二回に一回くらい出ます。「:」は二つです。
これは何が原因で、どうやったら直せますか?
ソースの修正箇所は、__dead
・__dead void usage(void) の __dead が定義されていなかったので、
#define __dead とした。
・fgetln() が宣言されていなかったようなので、
呼び出し箇所を my_fgetln() という名前に変更し、
/* $OpenBSD: util.c,v 1.23 2007/09/17 09:28:36 espie Exp $ */
/* $NetBSD: util.c,v 1.10 1996/12/31 17:56:04 christos Exp $ */
/*
* Copyright (c) 2001 Marc Espie.
*/
/* OPENBSD ORIGINAL: usr.bin/make/util.c */
と書かれた、fgeln() のソースを関数名を my_fgetln()に変更して追加した。
src.tar.gz というアーカイブの /usr/bin/diff から持ってきて、
わずかに修正後、cygwin でビルドには成功し、一応動作はするのですが、
「diff: : Cannot allocate memory」
というエラーが二回に一回くらい出ます。「:」は二つです。
これは何が原因で、どうやったら直せますか?
ソースの修正箇所は、__dead
・__dead void usage(void) の __dead が定義されていなかったので、
#define __dead とした。
・fgetln() が宣言されていなかったようなので、
呼び出し箇所を my_fgetln() という名前に変更し、
/* $OpenBSD: util.c,v 1.23 2007/09/17 09:28:36 espie Exp $ */
/* $NetBSD: util.c,v 1.10 1996/12/31 17:56:04 christos Exp $ */
/*
* Copyright (c) 2001 Marc Espie.
*/
/* OPENBSD ORIGINAL: usr.bin/make/util.c */
と書かれた、fgeln() のソースを関数名を my_fgetln()に変更して追加した。
653デフォルトの名無しさん
2014/05/30(金) 19:05:18.54ID:1vuEEnaV なお、diffのソース・フォルダで"Cannot" "allocate" "memory" と
いうキーワードを検索してみましたが、違うキーワードが含まれた
別の文字列の一部として存在しているだけでした。
「diff」という文字列を誰がどうやって表示しているのかさえ分かり
ません。__FILE__ マクロも検索してみましたが、見つかりません
でした。
いうキーワードを検索してみましたが、違うキーワードが含まれた
別の文字列の一部として存在しているだけでした。
「diff」という文字列を誰がどうやって表示しているのかさえ分かり
ません。__FILE__ マクロも検索してみましたが、見つかりません
でした。
654デフォルトの名無しさん
2014/05/30(金) 19:10:41.56ID:SSvUP3u/ argv[0]
655デフォルトの名無しさん
2014/05/30(金) 19:31:55.39ID:1vuEEnaV main() 関数の冒頭で、
{
char **oargv; // main のローカル変数
oargv = argv;
while ((ch = getopt_long(argc, argv, OPTIONS, longopts, NULL)) != -1) {
・・・
lastch = ch;
newarg = optind != prevoptind;
prevoptind = optind;
}
argc -= optind;
argv += optind;
・・・
set_argstr(oargv, argv);
・・・
}
のようになっており、oargv は上記以外では参照されておらず、
argv[0]を参照できる可能性が有るとすれば、
getopt_long() と set_argstr()
しかないようです。
これらの関数のうちどちらかが、メッセージを出しているのでしょうか?
{
char **oargv; // main のローカル変数
oargv = argv;
while ((ch = getopt_long(argc, argv, OPTIONS, longopts, NULL)) != -1) {
・・・
lastch = ch;
newarg = optind != prevoptind;
prevoptind = optind;
}
argc -= optind;
argv += optind;
・・・
set_argstr(oargv, argv);
・・・
}
のようになっており、oargv は上記以外では参照されておらず、
argv[0]を参照できる可能性が有るとすれば、
getopt_long() と set_argstr()
しかないようです。
これらの関数のうちどちらかが、メッセージを出しているのでしょうか?
656デフォルトの名無しさん
2014/05/30(金) 20:04:01.04ID:SSvUP3u/ 餅は餅屋
cygwinはcygwinから
cygwinはcygwinから
657デフォルトの名無しさん
2014/05/31(土) 07:45:18.26ID:6bjDZoIF OpenBSDのdiffソースをもってきた理由は、ライセンスの問題からです。
ところで、エラーの原因が判明しました。
set_argstr()の中で、argsize が負の値になり、xmalloc(argsize)
が内部で呼び出しているmalloc(argsize)に失敗し、err(2,NULL) を呼び、
err()が、malloc()が設定したグローバル変数 errno に応じたメッセージ
として「Cannot allocate memory」を出していたのでした。
なお、set_argstr(av,ave)のavには、main() に渡された状態の argv がそのまま
渡され、ave には、-オプションを除いた後にあるファイル名まで移動したargvの
値が渡されています。
どうも、OpenBSD では、argv[k] が、0終端文字列が隙間無く並べら
れている性質を利用しているようです。
argv[0],argv[1],argv[2],…
"cmd名",0,"-opt1",0,"-opt2",0,…,"file1",0,"file2",0
途中の 0x00 を0x20(空白)に置き換えるだけなので、argsize は、
そのままのバイト数で良いからこのようなコードになっている
ようです。4足しているのは"diff"という文字列のバイト数の分のようです。
ところで、エラーの原因が判明しました。
set_argstr()の中で、argsize が負の値になり、xmalloc(argsize)
が内部で呼び出しているmalloc(argsize)に失敗し、err(2,NULL) を呼び、
err()が、malloc()が設定したグローバル変数 errno に応じたメッセージ
として「Cannot allocate memory」を出していたのでした。
なお、set_argstr(av,ave)のavには、main() に渡された状態の argv がそのまま
渡され、ave には、-オプションを除いた後にあるファイル名まで移動したargvの
値が渡されています。
どうも、OpenBSD では、argv[k] が、0終端文字列が隙間無く並べら
れている性質を利用しているようです。
argv[0],argv[1],argv[2],…
"cmd名",0,"-opt1",0,"-opt2",0,…,"file1",0,"file2",0
途中の 0x00 を0x20(空白)に置き換えるだけなので、argsize は、
そのままのバイト数で良いからこのようなコードになっている
ようです。4足しているのは"diff"という文字列のバイト数の分のようです。
658デフォルトの名無しさん
2014/05/31(土) 07:46:03.82ID:6bjDZoIF 【修正前】
void set_argstr(char **av, char **ave)
{
size_t argsize;
char **ap;
argsize = 4 + *ave - *av + 1;
diffargs = xmalloc(argsize);
strlcpy(diffargs, "diff", argsize);
for (ap = av + 1; ap < ave; ap++) {
if (strcmp(*ap, "--") != 0) {
strlcat(diffargs, " ", argsize);
strlcat(diffargs, *ap, argsize);
}
}
}
void set_argstr(char **av, char **ave)
{
size_t argsize;
char **ap;
argsize = 4 + *ave - *av + 1;
diffargs = xmalloc(argsize);
strlcpy(diffargs, "diff", argsize);
for (ap = av + 1; ap < ave; ap++) {
if (strcmp(*ap, "--") != 0) {
strlcat(diffargs, " ", argsize);
strlcat(diffargs, *ap, argsize);
}
}
}
659デフォルトの名無しさん
2014/05/31(土) 07:46:54.80ID:6bjDZoIF 【修正後】
void set_argstr(char **av, char **ave)
{
size_t argsize;
char **ap;
argsize = 4; // "diff" 文字列の長さ
for (ap = av + 1; ap < ave; ap++) {
argsize += 1 + strlen( *ap ); // 間の空白 + 引数の文字数
}
argsize++; // 最後の NUL終端文字列
diffargs = xmalloc(argsize);
strlcpy(diffargs, "diff", argsize);
for (ap = av + 1; ap < ave; ap++) {
if (strcmp(*ap, "--") != 0) {
strlcat(diffargs, " ", argsize);
strlcat(diffargs, *ap, argsize);
}
}
}
void set_argstr(char **av, char **ave)
{
size_t argsize;
char **ap;
argsize = 4; // "diff" 文字列の長さ
for (ap = av + 1; ap < ave; ap++) {
argsize += 1 + strlen( *ap ); // 間の空白 + 引数の文字数
}
argsize++; // 最後の NUL終端文字列
diffargs = xmalloc(argsize);
strlcpy(diffargs, "diff", argsize);
for (ap = av + 1; ap < ave; ap++) {
if (strcmp(*ap, "--") != 0) {
strlcat(diffargs, " ", argsize);
strlcat(diffargs, *ap, argsize);
}
}
}
660デフォルトの名無しさん
2014/05/31(土) 07:52:02.32ID:6bjDZoIF なお、エラー表示に「diff」が表示されているのは、argv[0]を使って
いるわけではなく、ライブラリの err() 関数が自分でやってるんですね。
av に argv が渡されているので混乱しそうですが、たまたまです。
いるわけではなく、ライブラリの err() 関数が自分でやってるんですね。
av に argv が渡されているので混乱しそうですが、たまたまです。
661デフォルトの名無しさん
2014/05/31(土) 10:56:57.68ID:DtdLdmhz ううむ。確かに試してみるとcygwinのargv[n]はバラバラなアドレスだな
662デフォルトの名無しさん
2014/05/31(土) 14:38:59.00ID:iRT5FyvM この糞なdiffのコードはargvがらみ以外にも地雷がたくさんありそう。
argvがらみでも/usr/bin/diffがargv[0]に渡されたらダメなんじゃないか?
4ってmagic numberが糞だから。
>>661
連続してることに依存したコードは糞。
argvがらみでも/usr/bin/diffがargv[0]に渡されたらダメなんじゃないか?
4ってmagic numberが糞だから。
>>661
連続してることに依存したコードは糞。
663デフォルトの名無しさん
2014/06/01(日) 00:52:00.45ID:MxSjB8Q5 >>662
なぜダメ?ソース見て言ってる?
なぜダメ?ソース見て言ってる?
664デフォルトの名無しさん
2014/06/01(日) 00:57:21.10ID:MxSjB8Q5 というか、これぐらいで糞糞って言ってるのは初心者なんだろうな
665デフォルトの名無しさん
2014/06/01(日) 02:19:51.86ID:e/SJ8pUJ666652
2014/06/01(日) 13:29:53.55ID:uUGuheMf OpenBSD の diff ソースは、本質的に複雑な処理の割にはソースが驚くほど
短いです。正直言って、腕のよさを感じました。ソースは:
diff.c 11KB
diffdir.c 7KB
diffreg.c 39KB
xmalloc.c 3KB
の4つしかソースが無く、本質的には、diffreg.c のみの 1522 行しか
ありません。こんなに簡潔に書ける人は、世界でも余りいないのではない
でしょうか?
ただし、
・複数の変数を同一行でカンマで区切って宣言している。
・ローカル変数の名称には1文字など、とても短い物が多い。
・if () で処理が一行の場合、ブロック {} にせずに書いてある。
・空行が少ない。
などの特徴があります。
短いです。正直言って、腕のよさを感じました。ソースは:
diff.c 11KB
diffdir.c 7KB
diffreg.c 39KB
xmalloc.c 3KB
の4つしかソースが無く、本質的には、diffreg.c のみの 1522 行しか
ありません。こんなに簡潔に書ける人は、世界でも余りいないのではない
でしょうか?
ただし、
・複数の変数を同一行でカンマで区切って宣言している。
・ローカル変数の名称には1文字など、とても短い物が多い。
・if () で処理が一行の場合、ブロック {} にせずに書いてある。
・空行が少ない。
などの特徴があります。
667デフォルトの名無しさん
2014/06/01(日) 15:42:24.51ID:fiMuA4/7668652
2014/06/01(日) 18:18:52.63ID:uUGuheMf このdiffに関して、プログラミング技術の秀逸さ以外にソースが
短い理由があるとする666に書いたことに加えて、
・getopt() を使ってオプションの処理が短く出来ている。
・pread() を使って、lseek(), read()に分けずに書けている。
・正規表現ライブラリを使っている。
・fnmatch()なるワイルドカード式のパターンマッチテストを
使っている。
もあるようです。
短い理由があるとする666に書いたことに加えて、
・getopt() を使ってオプションの処理が短く出来ている。
・pread() を使って、lseek(), read()に分けずに書けている。
・正規表現ライブラリを使っている。
・fnmatch()なるワイルドカード式のパターンマッチテストを
使っている。
もあるようです。
669652
2014/06/01(日) 18:20:16.83ID:uUGuheMf670652
2014/06/01(日) 18:38:13.52ID:uUGuheMf さらに:
・goto 文を使っている。
・goto 文を使っている。
671デフォルトの名無しさん
2014/06/03(火) 06:34:30.54ID:mwJyftym gotoは、finallyの代わりに、エラー処理で使う場合や、
2重ループを一気に抜け出す場合はOK
2重ループを一気に抜け出す場合はOK
672デフォルトの名無しさん
2014/08/05(火) 09:27:23.16ID:wh+qTY5L MonoBehaviourの読み方が気になってプログラミングに集中できません
どなたか教えて下さい!
どなたか教えて下さい!
673デフォルトの名無しさん
2014/08/05(火) 13:21:49.58ID:AfbB56Nf モゥノゥ・ビヘイヴュア
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… [BFU★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★2 [BFU★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★2 [BFU★]
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 [Hitzeschleier★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 【維新】吉村知事「中国人観光客だけに頼るビジネスモデル変えていかないといけない」「高市総理の発言は撤回する必要はない」 [Hitzeschleier★]
- 中国高官と話す外務省局長の表情、やばい ★2 [175344491]
- 中国高官と話す外務省局長の表情、やばい [175344491]
- 港区、中国に宣戦布告 中国外務省をおちょくる掲示物を展示 [175344491]
- 【ほんこん悲報】吉本新喜劇の中国公演が中止に! [523957489]
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
- 小野田経済安保相「すぐに経済的威圧するところへの依存はリスク」😲 [861717324]
