タグ

Cに関するyukimori_726のブックマーク (125)

  • 書籍『Linuxによる並行プログラミング入門』: 柴田 芳樹 (Yoshiki Shibata)

    大学時代の私の恩師である重松先生の新刊です。C言語のプログラミング中級クラスの方を対象としているそうです。内容を見ていないですが、POSIX Threadによる並行プログラミングが書かれているのではないかと思います。 私がいわゆる並行プログラミングを学んだのは、アセンブリ言語でマルチタスクプログラミングをしていた大学時代を除けば、会社で学んだMesa言語によるものです。そうは言っても、Mesa言語でコードをたくさん書いた訳ではなく、既存のコードを修正・デバッグすることが主でした。 格的なマルチスレッドプログラミングは、1993年からSolaris 2.3を用いてC++言語で行いました。主に、Solarisに付属するマニュアルで学習しながらプログラミングしていました。 開発がほぼ終盤になった1995年の暮れに、出版されたばかりの『Threads Primer』を読みました。それまでは、スレ

    書籍『Linuxによる並行プログラミング入門』: 柴田 芳樹 (Yoshiki Shibata)
  • IBM Developer

    IBM Developer is your one-stop location for getting hands-on training and learning in-demand skills on relevant technologies such as generative AI, data science, AI, and open source.

    IBM Developer
  • Cコンパイラをスクラッチから開発してみた(日記)

    以前に8ccというCコンパイラをゼロからひとりで開発していたときのログです。40日でセルフコンパイルできるところまで到達しています。日付はすべて2012年です。コードとヒストリはすべてGitHubで見れます。 3月4日 というわけでコンパイラを作っているわけだけど、1000行くらい書いたらそれなりに動き始めてきた。こんなのも動くし: int a = 1; a + 2; // => 3 こういうのも通る。 int a = 61; int *b = &a; *b; // => 61 文字列は文字の配列として扱っていて、配列をポインタに成り下げる振る舞いも実装しているので、こういうのも通る。関数呼び出しもある。 char *c= "ab" + 1; printf("%c", *c); // => b 前回もこのあたりはがんばって実装したからここまで作るのはわりと単純作業かも。二回目だから配列とか

    Cコンパイラをスクラッチから開発してみた(日記)
  • shared memoryを使ったプロセス間通信

    shared memory(共有メモリ)は最も原始的なプロセス間通信で、普通のメモリのようにアクセスできるメモリです。 プロセスはプロセス固有のアドレス空間を持っていますが、共有メモリに確保されたメモリは 特別の空間で、プロセス間で共有されます。 共有メモリを使うための手順。 shmget()を使って、共有メモリを作成。 shmat()を使って、共有メモリのアドレスを取得する。(アタッチ) shmdt()を使って、共有メモリから離脱。(デタッチ) shmctl()を使って、共有メモリを開放。 誰かがshmget()を使って共有メモリを作成し、その共有メモリを使いたい人は、shmat()を使って アッタチし、使用が終わったら、shmdt()でデタッチします。最後にshmctl()で共有メモリを開放します。 shmget()は以下のように宣言されています。 int shmget(key_t k

  • C言語でLISPを作るチュートリアル『Build Your Own LISP』 | 100SHIKI

    かなりマニアックだが素晴らしいコンテンツなのでご紹介。 Build Your Own LISPは、C言語でLISP言語を作るチュートリアルである。 しかも完成品は1,000行に満たないというから驚きだ。さらに無料で読めてしまう。 作者はエジンバラ大学の院生のようですな。興味がある方は是非どうぞ。

    C言語でLISPを作るチュートリアル『Build Your Own LISP』 | 100SHIKI
  • 男なら潔くC言語書けよと言われた話。〜mod_db,mod_dbdの実装〜 - Y's note

    C実践プログラミング 第3版 作者:Steve Ouallineオライリー・ジャパンAmazon 恩師に言われた言葉 Geek女優の池澤あやかさんに会いたいと思っている@yutakikuchi_です。 池澤さんはRubyが出来てSFCで女優さんなんて羨ましいですね〜。僕なんてRubyは得意じゃないし東京とは言えないような都心から離れた場所の地味な国立大だし、何よりお金も無いパンピーだしね〜。 僕の学生時代にもRubyはあったんですけどRailsはまだ出始めでそんなに流行っている雰囲気は無かったし、Webを書くには面倒くさいJSP/ServletかPerlかって感じでした。ApacheのModuleでWebを書ける事も学生ながら知っていたんですが、ポインタ、メモリの動的確保/解放の間違いが頻発して開発効率が落ちるから極力Javaで、どうしてもCを書かなければ行けない時はC++で逃げてました。

    男なら潔くC言語書けよと言われた話。〜mod_db,mod_dbdの実装〜 - Y's note
  • C言語における暗黙の型変換とAPI設計 - もなもなもなかのページ

    #include <stdio.h> #include <stdlib.h> int main(void) { int a = 65535; char b; b = a; printf("%d %d\n", a, b); return EXIT_SUCCESS; } 「a に 65535 を代入し,b に a の値を代入しているのだから,b も 65535 になるはず.」 などとLL言語(JavaScriptRuby など)に慣れていると思ってしまいがちだが,そうはならない. なぜなら,一般に,char 型の変数が保持できる値の範囲は,int 型の変数が保持できる値の範囲よりも小さいから. 概ね(…とボカす理由は後述),char は -128 から 127 までの整数しか保存できない. この性質は,ときどき,極めて恐ろしい. C言語は,上の例のように保持できる値の範囲が小さい変数への

  • 第21章 ポインタを使用できる「安全でないコード」

    21-6 ポインタのサイズ ポインタには、++や--演算子が利用できるが、その際、変化する量はデータ型によって異なる。データ型によって占有するサイズが異なるので、++演算子で次のデータに進めたとき、進む量を変化させる必要があるためだ。List 21-6は具体的なサイズを、sizeof演算子で調べるサンプル・ソースだ。 1: using System; 2: using System.Runtime.InteropServices; 3: 4: namespace Sample006 5: { 6:   [StructLayout(LayoutKind.Sequential,Pack=1)] 7:   struct SampleStruct1 8:   { 9:     public int x; 10:     public sbyte y; 11:   } 12:   [StructLa

    第21章 ポインタを使用できる「安全でないコード」
  • Cプログラミング診断室/管理は複雑に/パイト・オフセット

    構造体をいっぱい使いだすと、構造体の各メンバーが、構造体の先頭から何 バイト離れているか(バイトオフセット)が欲しくなることがよくあります。 このとき、どのように苦労してバイトオフセットを求めたかを示す絶好のプロ グラム例があります。exdef.h(リスト5−10)が構造体宣言で、exdef2.h (リスト5−11)がバイトオフセットをマクロに求めるものです。実際のファ イルは構造体の宣言が延々と並んでいるので、先頭の2つの構造体の部分まで を示します。 構造体のメンバーの名前が全部大文字になっているのは、マクロみたいで気 味が悪いですね。できれば小文字で、もっと長い名前にしたいものです。まあ、 今回はその辺りの書き方には目をつむることにします。 1 /*------------------------------------------------------*/ 2 /* (1) CA

  • Log in with Atlassian account

    We tried to load scripts but something went wrong. Please make sure that your network settings allow you to download scripts from the following domain: https://id-frontend.prod-east.frontend.public.atl-paas.net

  • 標準Cライブラリの実装 strlen関数

    今回は文字列の長さを調べるstrlen関数です。こういう単純な関数は、アセンブリ言語で記述すれば、より高速化できる場合もあるのですが、とりあえずはC言語で実装することにします。アセンブリ言語を使って、高速化の余地があるものについては、後ほど機会があれば扱いたいと思います。 それでは早速strlenの実装を行います。まずは、最も素直な実装からはじめてみましょう。 #include <stddef.h> size_t strlen(const char *s) { size_t n; for (n = 0; *s != '\0'; s++, n++) ; return n; } ご覧の通り、文字列sを最初から順番に調べ、ナル文字が見つかるまでnをインクリメントしています。この実装でも動作はしますが、あまり効率はよくありません。なぜなら、1回ループするごとに、2回もインクリメントを行っているから

  • tricklib.com

    This domain may be for sale!

  • スタックオーバーフローのハンドリング (Stack Overflow Handling)

    作成日:2004.04.12 更新日:2006.02.19 更新記録 (2004.04.12) 3/6、 3/11、 3/13 の日記をまとめて作成。 (2004.05.07) 文章を修正。サンプルコードを追加。 (2005.01.20) alternative → alterante に修正。 (2005.02.13) 追記を記述。 (2006.02.17) linux_stack_info.cpp の実装に誤りがあったので修正。 (2006.02.19) BSD 系OS でのスタック領域情報の取得の仕方を追加 初めに C/C++ でプログラムをしているとつい忘れてしまうのがスレッドのスタックオーバーフローの問題。 最近の OS はスレッド当たり 2〜8MB のスタック領域を持っているため、よほどのことがない限りスタックが溢れてしまうことはない。 だが、再帰や alloca を積極的に使

  • DBサーバ向けLinuxチューニングを考える 〜 メモリオーバーコミット編 : DSAS開発者の部屋

    Cでプログラムを書いていて大量のメモリを確保したくなったとき、大抵は mallocを使うと思いますが、その際には戻り値がNULLかどうかを判断してエラー処理に飛ばすと思います。しかし、Linux のメモリ管理サブシステムには「メモリ・オーバーコミット」という機構があり、実装されているメモリ以上の領域を確保できてしまいます。 #include <stdio.h> #include <stdlib.h> int main() { int i; char *p; for(i=0;i<65536;i++){ p = (char *)malloc(65536); if(0 == (long)p){ break; } } printf("SIZE=%dMB\n",i*65536/1024/1024); return(0); } swapoff したメモリ 1G のマシンでこれを実行するとこんな感じにな

    DBサーバ向けLinuxチューニングを考える 〜 メモリオーバーコミット編 : DSAS開発者の部屋
  • C言語プログラミング ifdefでデバッグする方法

    プログラム開発をする過程で、デバッグをすると思います。 今どのような値が入ってるかを確かめたり、開発中には同じパラメータを使うため、コードの中にハードコードをしておいたり、といったことを多々やります。 デバッグするために printf() を大量に埋め込んだりして、でも、リリースするときには、それらを消したり、コメントアウトしたり、といった作業が必要になったりします。 また再び、開発を再開したときに、同じようなprintf()を埋め込んでいったりして、結構面倒なことをしてるケースもあります。 printf()デバッグをするなといえば、それまでですが、人それぞれ、やり方がありますし、場合によってはそれでよいと思います。 そんなときに、プリプロセッサディレクティブ(ifかifdef)を利用します。 しかしながら、ifdefで制御する場合、ソースコードが読みにくくなるデメリットがあります。 eb

  • ポインタとメモリと型(構造体)の関係 (1) - C言語 - 碧色工房

    さて、前回までに BMP 形式の読み込み、書き込みを行う関数を紹介しました。 そこで出てきた小技の説明をしたいと思います。 それにはメモリとポインタの関係についての知識が必要ですので、 ポインタの基を説明します。というかこれがすべて。 ポインタというのは C 言語が持っている一つの強力な機能です。 一方で、 C 言語初心者にとって最大の難関ともいえるものです。 しかし、これをマスターしてしまえば非常に便利で、様々な応用ができるようになります。 (実際ポインタだけで1冊のが出ているくらい奥が深いもの) まあ、いいことばかりではなくて、ポインタは使い方を誤ると非常に危険な諸刃の刃です・・・ (ポインタはバグの宝庫とまで呼ばれてたりする) あと、注意事項として以下でプログラムを書いて実行していますが。この結果は処理系依存となります。 このような結果になるという前提でプログラムを書くと、移植性

    ポインタとメモリと型(構造体)の関係 (1) - C言語 - 碧色工房
  • ポインタとメモリと型(構造体)の関係 (3) - C言語 - 碧色工房

    前回は、ちょっと高度ですが、非常に処理系依存で、最終的につかうかどうか分からない知識でしたが。 今回と次回で紹介する内容はちょっと高度だけど、 初心者がもう一歩ステップアップするところでは必ずといっていいほど必要になる知識だと思います。 では、いってみましょう~~ void型ポインタ 一般的な入門書ではおそらく扱われていない、 もしくは扱われていたとしてもそういうものがあるという程度で 実際どうやって使うのかまでは書かれていないと思いますが、 C言語には「 void 型ポインタ」というものがあります。 単に「 void 」という記述は、返値の型などでよく見かけると思います。 返値の方で指定すると、何も返さないということを示すものです。 また、引数に書いた場合、何も引数をとらないという意味になります。 すなわち、 void は何もないという意味で用いられています。 では「 void 型」のポ

    ポインタとメモリと型(構造体)の関係 (3) - C言語 - 碧色工房
  • インクルードガード

    [ C++で開発 ] インクルードガード 少し込み入ったプログラムを開発していると、ヘッダファイルを2重にincludeしてしまい、コンパイルエラーとなることがあります。ここでは、その回避方法として使われる内部インクルードガードと、include処理時間を大幅に削減しコンパイル時間を短くする冗長インクルードガードの2つを取り上げます。 (追加)最近のGCCでは#pragma onceも無警告で使用できるようになっているようです。 インクルードガードの必要性 2重インクルードの発生 まず、2重インクルードが発生する例を見てみます。

  • OMake つかったらC言語でプログラム書く手間がバカみたいに減った - 日記を書く[・ _ゝ・]はやみずさん

    OMakeすごい。OMakeはマジですごい。 OMakeはGNU makeの代替品みたいなものなんだけど、正直なところこのツールの強力さはGNU makeと比べると失礼なくらいすごい。これのおかげで、「コード修正→ビルド→デバッグ→コード修正→・・・」のループの、ビルドにあたる作業がほぼ消え去った。 ファイルの依存関係の解析がとにかくすごい。よくあるユースケースなんかの場合、最小限の手間でほぼ完璧に依存関係を網羅して、よしなにビルドしてくれる。 とりあえず、はやみずが実際に使ってみたケースを例にとってそのすごさの一端を紹介しようと思う。 case study 論より証拠ということで、自分が OMake を試しにつかってみたケースを紹介する。C言語でスタティックライブラリを作っていて、それに加えて簡単なテストプログラムを書いている。 /include/ 以下にヘッダファイルが全部ある /sr

    OMake つかったらC言語でプログラム書く手間がバカみたいに減った - 日記を書く[・ _ゝ・]はやみずさん
  • プリプロセッサとインクルードガード(C/C++) - ゲーム作ろうよ

    C/C++にてファイル分割を行う際に問題となる点がありました。 ヘッダファイルには各種ソースファイルの共通部分を置きたいのですが 何度も読み込まれる可能性があるにも関わらず定義は1度しか行えないということです。 (以下を参考:宣言と定義とファイル分割) このときに役に立つのがプリプロセッサです。 プリプロセッサとはコンパイラに対する命令群のことです。 #includeや#defineなどが該当します。 さて、いくつかのプリプロセッサを見てみましょう。 #include AAA // AAAを読み込みなさい。 #define AAA // AAAを定義しなさい。 #ifdef AAA // AAAが定義されたら以下を読み込め。 #ifndef AAA // AAAが定義されていなかったら以下を読み込め。 #endif // #ifdefの範囲はここまで。 ではインクルードガードを例にとって考

    プリプロセッサとインクルードガード(C/C++) - ゲーム作ろうよ