• ベストアンサー

パイプのバッファ開放のタイミング(Linux C言語)

パイプのバッファ開放のタイミング(Linux C言語) パイプを使って同一プロセス上でスレッド間の通信を行おうと思っています。pipe()でファイルディスクリプタを用意して、2つのスレッドで使用します。このとき、メモリ上にバッファが確保されると思うのですが、このpipeのバッファが開放されるタイミングはいつでしょうか? //2つのファイルディスクリプタがcloseされた時? 組み込み機器の一つのプロセス上で何度もpipeを使うので、メモリの開放のタイミングが気になっています。 ご存知でしたらご教示ください。よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

close() したときでしょうね。pipe() も fd としてしか見れないので、他に制御する術はなさそうに思います。 あとは別のスレッド間通信の方法を使うかでしょうか。

udonbe
質問者

お礼

ご回答ありがとうございます。 やはりそうですよね。 その後ネットで検索して改めて調べているとそれらしい記述を見つけました。 //URLがわからなくなって貼り付けられないですが、、

関連するQ&A

  • LINUXでC言語のプログラミングについて

    私は、現在情報工学科の学生です。現在学校でLINUXの科目を受講しています。私は今まで、学校から出された課題は自分でやってきましたが、この問題だけはどうしても解けず、このような場を借りて、問題のプログラミングについて皆様にご教授をお願いしています。自分でいろいろ調べ、考えてみましたがそれでも自分の知識が足りず、プログラムを作ることができませんでした。プログラムと解説のご教授をお願いします。 OS Linux プログラミング言語 C言語 コンパイル方式 [gcc] *****問題***** #include <manにより調べること> void main(argc, char *argv[]){ int n, fd[2]; char line[MAXLINE]; pid_t pid; if (pipe(fd)<0) exit(1); if ((pid=fork())>0) { /*parent process */ close (fd[0]); write(fd[1], "Hello\n", 6); } else{ /*child process */ close (fd[1]); n = read(fd[0], line, MAXLINE); write (1, line, n);/* write(fileno(stdout), line,n); } else exit(1); /* fork error */ exit (0); } (問題1)上記をもとに親プロセスがキーボードから入力した行をパイプで子プロセスに標準出力ファイルとして送り、子プロセスは標準入力から受けとってスクリーンにエコーバックするようなプログラムを作れ。ヒント:dup2(fd[1],fileno(stdout)), fgets(line, MAXLINE, stdin), fputs(....) (親) (子) キーボード-->| stdin stdout| ---> |stdin stdout|---->ディスプレイ

  • パイプを用いた通信 C#とMATLAB

    パイプを使用しC#から送信したデータをMATLABで受信することは可能でしょうか?   もし可能であるならばどのようにすればよいのでしょうか。 以下のプログラムで行っているのですがMATLAB側で受信ができず -1がかえってきてしまいます C言語で受信する場合はうまくいくのですがMATLABを使用するとファイルのopneができません。 以下C#・MATLABプログラム C# <プログラム> 送信側 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Pipes; using System.IO; namespace PipeTest { class Program { static void Main(string[] args){ Console.WriteLine("パイプ接続待ち..."); NamedPipeServerStream pipe = new NamedPipeServerStream("test"); pipe.WaitForConnection(); Console.WriteLine("送信(キーを押すと終了)"); StreamWriter stw = new StreamWriter(pipe); stw.AutoFlush = true; while(Console.KeyAvailable == false) { stw.WriteLine("This is a test"); System.Threading.Thread.Sleep(500); } Console.WriteLine("終了"); pipe.Close(); } } } MATLAB <プログラム> 受信側 fp = fopen('C:\\\\.\\pipe\\test');

  • C言語のfork()とpipe()の使用方法についてのサンプルを作成し

    C言語のfork()とpipe()の使用方法についてのサンプルを作成していますが、 期待通りの動作をさせる事ができないため、質問させて頂きます。 現在は、aaa.txtの1行目(てすとだよ。)のみ出力されて2行目が出力されません。 (1)実行方法:a.out aaa.txt (2)期待動作:aaa.txt の内容を出力 <aaa.txt> てすとだよ。 pipeだよ。 <ソース> #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <stdlib.h> #include <string.h> #define BUFF_SIZE 1024 /* バッファのサイズ1M */ int main(int argc, char **argv) { int pipefd[2]; int p_id; int ret; /* 関数の戻り値 */ int status; FILE *fp; char buff[BUFF_SIZE]; ret = pipe(pipefd) ; /* パイプ生成失敗 */ if(ret == -1) { perror("main"); exit(EXIT_FAILURE); } /* 子プロセス生成 */ p_id = fork(); /* 子プロ生成失敗 */ if(p_id == -1) { perror("main"); exit(EXIT_FAILURE); } if(p_id == 0) { /* 子プロセス側処理 */ printf("子プロ処理開始!!!\n"); /* 使用しないwrite側はクローズ */ close(pipefd[1]); /* パイプから読込む */ while(read(pipefd[0], &buff, BUFF_SIZE) > 0) { fputs(buff, stdout); } close(pipefd[0]); printf("子プロ処理終了!!!\n"); } else { /* 親プロセス側処理 */ printf("親プロ処理開始!!!\n"); /* 使用しないread側はクローズ */ close(pipefd[0]); printf("親プロ:読込ファイル名[%s]\n",*(argv + 1) ); if( (fp = fopen( *(argv + 1), "r" ) ) != NULL) { while(fgets(buff, BUFF_SIZE, fp) != NULL) { printf("パイプに書込む値:%s\n",&buff[0]); /* パイプに書き込む */ write(pipefd[1], buff, strlen(buff) + 1); } fclose(fp); } else { perror("親プロセス "); } close(pipefd[1]); wait(&status); } return EXIT_SUCCESS; }

  • C言語 メモリ?

    最近、C言語の勉強を始めているものです。 gccでコンパイルし、実行ファイルを実行すると 強制終了 と表示されます。 gdbで実行してみると、 Program terminated with signal SIGKILL, Killed. The program no longer exists. You can't do that without a process to debug. と表示されました。 プログラムの中で、二次元配列 a[10000][10000],b[10000][10000] というような大きい配列を使っているのが原因なのかなと思っていますが、どうなんでしょうか?mallocでメモリを確保したらいいのでしょうか? ソースを載せることができなく申し訳ないですが、よろしくお願いします。

  • GlobalAlloc について

    GlobalAlloc について 質問させて下さい。 VC++ 2005 MFC で開発しております。 仕様の概要と致しまして、 ::GlobalAlloc()でHGLOBALを取得し、 メンバ変数に格納(Arrayでリサイクルしていくイメージ)した後、スレッドを走らせ格納したHGLOBALを 使い処理をした後に、GlobalFree()でメモリを開放します。 アプリの仕様上、スレッドの処理に少々時間がかかり GlobalAlloc()とGlobalFree()が必ずしも一対一で実行されず、 スレッドのGlobalFree()が実行される前に別のGlobalAlloc()がくることがあります。 このような場合、下記のように確保するヒープ領域の取得したアドレスが 少しずつ増えてしまい、最終的には取得できなく(GlobalLockでNULLポインタ)なってしまいます。(4GB越え) 8バイトずつアドレスが増えていくとして ------------------------------------------------- ・一対一の場合 (同じアドレスが使用できる) 確保 開放 (1)0008 (2)0008 (3)0008 (4)0008 (5)0008 ・一対一でない場合 (開放される前に確保するので新しいアドレスを使用してしまう) 確保 開放 (1)0008 (2)0008 (3)0008 (4)0016 (5)0008((3)メモリ) (6)0024 (7)0032 (8)0040 (9)0016((4)メモリ) (10)0024((6)メモリ) (11)0032((7)メモリ) (12)0048 : : : ------------------------------------------------- GlobalFree()がもれているのではなく メモリを確保したものは遅れはするものの必ず開放はしています。 このような場合、上記の「一対一でない場合」の (6)で「0024」番地ではなく「0008」番地からメモリを確保することは出来ないのでしょうか? 確保と開放が一対一に統合されていればこのような問題はない(常に同じアドレスを使用できるため)のですが、 アプリの使用上、仕方ないと考えております。 説明が複雑になってしまい、わかりにくいとは思いますが、 お詳しい方がおられましたら、ご教授の程宜しくお願い致します。

  • Linux KVMゲストOSのプロセスはホスト上で

    LinuxでKVMを使ってゲストOS環境を用意し、そこで各種プロセス/スレッドを起動した場合、それらはホストOS上でどう見えますでしょうか? ・ホストOS上にも同じようにプロセス/スレッドが作成される。ゲストからはアクセス可能だがホストからは存在を認識できるだけで、特権ユーザーでなければkillできない。 ・ホストOS上のKVMプロセスが利用するリソース(CPU、メモリ、etc.)が増えるだけ。ホス トからはゲストが何をやってるか全くわからない。(VMWare Playerと同じような感じ) どちらになるでしょうか? クラウド化するにあたっての実験をこれから計画するにあたって、事前にプロセス/スレッドの振舞いを知っておく必要があり、ご質問いたします。

  • LinuxのDMA転送でのメモリ操作について

    Linux初心者です。 ユーザモードで動作しているプロセスからデバイスドライバに対してDMA転送要求を行った場合、ドライバでDMAバッファ用のメモリを確保すると思います。 ドライバはDMA転送用バッファとして、GFP_DMA指定でkmallocし、確保されるメモリ領域はZONE_DMAだと思います。 (PCIデバイスドライバの場合は、上記指定は必須ではないみたいですが。) ここで疑問なのですが、カーネルモードでしかアクセスできないZONE_DMA領域を、ユーザモードのプロセスがどのように扱うのでしょうか? ある本で「ユーザモードで動作中でもシステムコールに関してはCPU内でカーネルモードで動作する」というのを見たことがあるのですが、これによってZONE_DMA領域にアクセスできるようになるということでしょうか? ご存知の方がいたら、よろしくお願いします。 また、そもそも質問内容(前提)の間違えなどありましたらご指摘いただきたいです。

  • メモリリーク

    Windowsのサービスからプロセス起動をし、プロセスから_beginthreadでスレッドを作成し(マルチスレッド)、スレッドの中で30秒ごとにSNMPリクエストするようなプログラムを作成しましたが、不定期にメモリ使用量が増えています。 ソースコードをチェックしましたが、クローズ漏れはありません。 情報が少ないですが原因が分かる方がいれば、教えてください。 開発環境はWindows2000,VC6.0です。

  • Linuxでのスレッド間メッセージについて

    Linuxでスレッドを複数生成し、スレッド間でメッセージのやり取りをしたいと思っています。 ネットで色々検索したのですが、欲しい情報にめぐり合えていません。 # WindowsのPostThreadMessage()みたいなものを探しています。 #「プロセス間通信」というものは発見しましたが・・・ 何か方法はありますでしょうか? スレッド間のメッセージのやり取りの方法がない場合は代替案も教えて頂きたいです。 # セマフォを用いて共有メモリアクセスかな?と思っています。

  • サーバのメモリについて

    現在、CentOS5にてサーバを運用しています。 昨日から、ホスティング業者より、残メモリが少ない旨のメールが届くようになりました。 そこで、メモリを確認したところ以下のような状態でした。 #free -m total used free shared buffers cached Mem: 8118 5721 2397 0 372 4811 -/+ buffers/cache: 537 7580 Swap: 2047 0 2047 linuxはメモリに空きができると、バッファやキャッシュに割り当て、 そのバッファやキャッシュも空きメモリとして計算できるようですので、 上記のような場合ですと、7.5Gくらい空きがあるということになり、 問題ないと考えて大丈夫でしょうか。 また、バッファやキャッシュで確保しているメモリを解放する方法はありますでしょうか。

専門家に質問してみよう