ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

fork/exec/pipe

2012-11-17 16:07:08 | PG(C言語)

C言語で別プロセスを起動するにはfork関数を使うよね。
別プログラムを実行するときってexec系関数使うよね。関数名からしてよく忘れるけど^^;
それと関連してpipe関数っていうのもなんかよく分からないけどよく出てくるよね。

というくらいは知っていたんだけど、実際に使ったことは無かったので、この際だからメモしておく。
今さらこれらが参考になるという人も少ないだろうけどなぁw

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

変数を1個だけ使って1~100を合算するC言語プログラム

2012-03-26 22:07:54 | PG(C言語)

今日Twitterで、変数を1個だけ使って1から100までの和を作れというお題(Σ100)が流れていた。そのひとつであるtanakhさんのC言語のプログラムを見て、自分もC言語で作ってみた(笑)

C言語ではmain関数からプログラムの実行が始まるのはみんな知ってるけど、(C言語ってのはひどい言語でw、)mainの引数は省略できるんだよね。
自分が知っている範囲では引数は3つあって、main(int argc, char* argv[], char *envp[])。(4つ目もあったような気がするけど、覚えてない…)
argcは実行時引数の個数、argvはその値の配列、envpは環境変数(「変数名=値」という形式)の配列。引数の個数はargcで渡されるのに、envpの個数は渡されない。envp++でポインターを進めていって、*envpがNULLだったら終わり^^;
ちなみにargvも「argv[argc]==NULL」なのが保証されていたはず。

で、自分が作ったΣ100のプログラムは、このうちの第1引数(argc)をカウンターに使おうという鬼畜な構造(爆)
引数を99個渡してやれば、(必ずプログラム名として1個は渡されるので)argcは100になる。さすがに引数を99個書くのは面倒だったので、UNIXのseqを使ったけど^^; 

こういう、シンプルで変なプログラムは意外と好きだったりするのだった(笑)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

systemとexec

2011-07-29 22:49:07 | PG(C言語)

昨日作ったC言語のプログラムを(ちょっとだけど)早速修正(苦笑)

C言語で外部プロセスを呼び出すにはsystem関数とexec系関数がある。
これを使ってCygwin上のシェルを呼び出すのに、昨日公開したやつは
system("bash.exe /home/hishidama/run.sh")
という形の呼び出しをしていた。

でもsystem関数はシェルを直接呼び出せるので、
system("/home/hishidama/run.sh")
でいい。

もしくは、exec系の関数を使うなら
execlp("bash.exe", "bash.exe", "/home/hishidama/run.sh", NULL)
の様に、bash.exe経由で呼び出すことになる。

昨日のはsystem関数を使ってるんだから、わざわざbash.exeを呼び出す必要は無い。色々試してる内に混ざっちゃったかな(汗)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

#line・#error

2010-12-09 06:24:17 | PG(C言語)

C言語を使っていてプリプロセッサ命令の#defineを知らない人はいないだろうし、#if・#ifdef辺りも知られていると思う。
でも#lineとか#errorはあまり知られていない気がする。

#lineは、元となったソースのファイル名と行番号を示すもの。
(コンパイラーによっては、)コンパイルエラーになった時に、その元となったファイル名を表示してくれる(かもしれない)。
逆に言うと、本当にエラーが出た場所が分からなくなる可能性もあるけど^^;

#errorは、コンパイルエラーを発生させるもの。
ヘッダーファイルがちゃんと読み込まれているかどうか・あるいは記述されている定義が#if等によって無効になっていないかどうかを確認する為に、#errorを埋め込んで、そのエラーが出るかどうかで判定する…なんて使い方が出来るかも。

C言語で「(定義されているはずの)構造体が見つからなくてコンパイルエラーになる」というような場合、その定義近辺で何か間違っている可能性が高い。
定義がきちんと読み込まれているかどうかの確認に#errorが使えるんじゃないかなーと思う。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

printfの型

2009-05-25 06:38:14 | PG(C言語)

あまり意識しない事が多いような気がするけど、C言語のprintf()では、書式文字列とそれに該当する引数の型が一致していないといけない。
%dはintを扱うので、shortやlongを渡してはいけない。
ただ、intが32bitでlongも32bitだったりすると、longを渡しても動いてしまう。また、引数1つが最低32bit(int1個分)を確保するような実行環境なら、shortやcharを渡しても動くかもしれない。

%p(アドレス表示用)の存在も意外と知られていない気がする。
%xで代用できると言えば代用できるが、上述の通り、環境によっては、引数の長さがライブラリーの想定している長さと不一致になってしまう為、おかしな値が表示される。それどころか、暴走することもあるかも(苦笑)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする