• ベストアンサー

基本的な質問です。

HackerXの回答

  • ベストアンサー
  • HackerX
  • ベストアンサー率40% (2/5)
回答No.2

Linuxで自然死する多くの問題は、リソースの解放のし忘れです。 この様な問題は、すぐには死なないけど、何時も決まったタイミングで死にます。 例えば、ソケットやファイルのディスクリプタ―やスレッドのハンドルを作りっぱなしで解放しないとか? もし、pthreadを使っているならば、joinしないで、放置していないかを確認してください。1024回で生成しなくなります。初めから、detatch状態にするとかが良いかもしれません。 > 1点、確認したいのはシステムコールrecvfrom()のパラメータの受信バッファに対して、auto変数でも構わないかです。 かまわないと思いますが。 問題があるとすれば、放置しなくてもすぐに死ぬはずですから。 だから、定期的にディスクリプタ―を生成するところを疑ってみては如何でしょうか?

関連するQ&A

  • recvfrom関数の戻り値がおかしいんですが…

    初めて投稿させていただきます。 現在、Cにてあるクライアントプログラムを作成している者です。 構成は以下の通り。 《構成》 サーバ:PLC(シーケンサと書けば大体の方はわかりますか?) クライアント:Linux Ubuntu9.10 通信方式:TCP/IP 《開発環境》 言語:C IDE:eclipse コンパイラ:gcc 4.x 《質問》 クライアントプログラムからASCIIデータをサーバへ送信し、サーバはクライアントから受信したASCIIデータに応答し、ASCIIデータ伝文を返信してきます。 このサーバからのASCIIデータ応答伝文をrecvfrom関数で受信し、応答伝文のASCIIデータを'buf'変数に格納し、標準出力関数で表示させるといったプログラムです。 このプログラムでは、ユーザ関数内でrecvfrom関数をコールしているのですが、ユーザ関数内でrecvfrom関数をコールした場合、受信データの先頭4byteしか受信できておらず、困っています。 ちなみに、main関数内でrecvfrom関数をコールすると、応答伝文全体のデータをきちんと受信できています。 ちなみに、サーバの応答ASCIIデータ伝文は、仕様通り(期待通り)のデータが返信されています。(ネットワークモニタ:wiresharkで確認済み) recvfrom関数をコールする場所によって、変数に格納するデータ量が変わるといったことがあるのでしょうか。 ソースの一部を添付します。 参照の上、アドバイス等いただけないでしょうか。 《ソース》 ◆mainソース #include ... :<-#include定義 int main{   :<-変数定義、変数初期値代入処理等 ユーザ関数1()コール<-ユーザ関数1内でソケット通信処理を動作させている。 ユーザ関数2()コール<-同上 } ◆ユーザ関数用ソース #include...   :<-#include定義 unsigned char ユーザ関数名1;<-ユーザ関数プロトタイプ宣言 unsigned char ユーザ関数名2:<-同上 char 変数1[5]; char s_buf[4096]; char buf[4096]; /*データ受信用バッファ*/ char 変数2[256]; size_t len; long l; int sock_fd; /*ソケット用ファイル記述子*/ struct sockaddr_in cl_addr; /*CPU用ソケットアドレス*/ socklen_t cl_len = 0; /*cl_addrのサイズ格納用*/ ssize_t n = 0; unsigned char ユーザ関数1(char *引数1,…char *引数5){   :送信データ生成処理 //* ソケット作成 *// if ((sock_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); return 1;   } //* 接続先定義*// memset(&cl_addr, 0, sizeof cl_addr); cl_addr.sin_family  = AF_INET; /*プロトコル定義*/ cl_addr.sin_addr.s_addr = inet_addr("***.***.***.***"); /*IPアドレス定義*/ cl_addr.sin_port  = htons(****); /*Port定義*/ //* 接続 *// if (connect(sock_fd, (struct sockaddr *)&cl_addr, sizeof cl_addr) < 0) { perror("connect"); return 1;   } //* データ送信 *// if(send(sock_fd, s_buf, strlen(s_buf), 0) < 0){ fprintf(stderr, "could not send message : %s\n", s_buf); exit(EXIT_FAILURE); } printf("\nSendMessage\n%s\n",s_buf); //* データ受信 *// cl_len = sizeof cl_addr; //*↓↓このrecvfrom関数でbuf内にサーバ応答伝文の先頭4byteのみが格納されている。↓↓*// if (( n = recvfrom(sock_fd, buf, sizeof buf,0, (struct sockaddr *)&cl_addr, &cl_len)) < 0) { perror("recvfrom"); return 1; } fprintf(stderr ,"TCP from addr = %s, port = %d\n", inet_ntoa(cl_addr.sin_addr), ntohs(cl_addr.sin_port) );

  • RPGのプログラム感のパラメーター

    サブプロにパラメーターを渡し、処理をさせたいのですが、 サブプロは曜日計算をさせるもので、 パラメーターはA(4桁の西暦),B(2桁の月),C(2桁の日付)の変数で、 それぞれ桁数が4,2,2小数点桁数はすべて0です。 この3つを渡し、処理をさせWEEKという変数に曜日を算出させ、元のプログラムにその値を返したいのですが、受け渡しと値の戻し方がわかりません。 受け渡し側のパラメーターの宣言の仕方、CALLの仕方、WEEKの値の受け取り方 受け渡される側のパラメータの宣言の仕方、値の戻し方を教えてください。 よろしくお願い致します。

  • C#で共有変数の定義をするには

    C#で共有変数の定義をするには、どうしたらよいでしょうか。具体的には、起動パラメータで、任意の文字列(3~4バイト)を渡して、C#アプリケーションを、起動し、プログラムの任意の場所で、そのパラメータを参照したいと考えています。起動パラメータの受け取りは、できるのですが、そのパラメータを、プログラムのどこからも参照できる領域(ここの定義方法が不明)に格納するには、どうしたらよいでしょうか。(2重起動を許す前提です。実行時に1つの目のプログラムにはパラメータ"XYZ"を渡し、2つ目のプログラムを起動時にはパラメータ"ABCD"を渡し、その値により、プログラムの動作を制御したいと思っています) Windows-xp visual-studio2008 C#でwindowsアプリケーションを作成しています。

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

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

  • 浮動小数演算での誤差の蓄積が起こっているのかどうか

    C++でプログラミングの勉強をしています. 以下の現象で悩んでいます. ある実数演算(double)をする関数A(実数パラメータxを用いた積算)を 以下の2種類の方法で用いると,結果が微妙に変わってしまいます. (1)パラメータxを微小に変化させながら,関数Aをfor文でループさせ,最後の結果を入手する.  (xを変化させても,Aの結果が変わらないようにその他の変数を初期化しているのですが・・・) (2) (1)の最終条件(パラメータxの大きさ)を同じにして,関数Aを1回のみ用いて,結果を入手する. 条件は同じはずなので,同じ結果が出て欲しいのですが, 結果が変わってしまい困っています. この場合考えられる原因としては何があるでしょうか? ・前のパラメータの時の実数演算の誤差が積み重なっている可能性はありますか? (でも,ループ中に共有している変数は必ず初期化しているのですが・・・) ソースコードは複雑なため,載せることはできません. 大変申し訳ございません. 原因としてどんなことが考えられるのかを教えて頂けると助かります. 宜しくお願い致します.

  • C++での標準関数の位置は?

    linux (centos) C++で、文字列操作用のクラスを作っています。(ほとんどCなのですが・・) で、文字列→数値変換用のメンバを追加したところ、エラーが発生しました。 // ソース 問題箇所以外は割愛 #include "stdio.h" #include "string.h" using namespase std; class mystring {  char *pchBuff; //文字列保持用のバッファ:割愛していますが、領域確保→挿入しています public:  int atoi(){ return atoi(pchBuff); } }; でコンパイル時に以下のようなエラーが出たため、 error: no matching function for call to ‘mystring::atoi(char*&)’ 名前空間が違うと思い int atoi(){ return std::atoi(pchBuff); } としたのですが、やっぱり以下のようなエラーが発生しました。 error: ‘atoi’ is not a member of ‘std’ メンバ関数名を変更するとエラーが出なくなるのですが、出来ればatoiメンバで使いたいのです。 atoiなどCの標準関数の名前空間はどこになっているのでしょうか? (名前空間の問題じゃ無い場合、その辺りもご指摘頂けるとありがたいです。) よろしくお願いします。

  • ソフトウェア工学でわからないことがあります。

    WindowsやLinuxなどのOSでは、複数のアプリケーションプログラムを同時に動作させることができます。 (1) この並列に動作する単位を何と呼びますか? (2) (1)は、それぞれに独立した論理メモリ空間を割り当てるため、その制御はオーバーヘッドが大きい。よって、1つの(1)の中で論理メモリ空間を共有した並列処理単位を実現する機構がある。 この単位を何と呼びますか? (3) (2)には、その処理の実行に必要な変数や関数の呼び出しの戻り番地を格納するためのメモリ領域として割りつけられるものは何ですか? ソフトウェアに詳しい方、回答お願いします。

  • 線形計画問題

    最近線形計画法について独学で勉強を始めたのですが いくつかの書籍を調べてもどうしても分からない点が あったのでこの場を利用させて頂きます。 頭を悩めていますのは制約条件が特殊なためです。 問題を簡略すると以下のようになっています。 min : x(1)/2 + 5x(2)/2 suject to: 1/x(1)+1/4x(2) ≦ 8 x(1) ≧ 0, x(2) ≧ 0 御覧頂けますように制約条件において決定変数が 分母にきているのです。目的関数で分母に変数を 持つものは分数計画問題といるのを拝見した事が あるのですが上記のような例は探し方が悪いのか 見つける事ができていません。 実行可能領域は非有界ですが最小化問題のため 上記の例であると2変数なのでグラフにプロットする 事でおよそですが解は見つかりました。 しかし実際の問題は10変数以上の問題となっています ので解が求められません。 その後も実行可能領域を多面体で近似すれば良いのか 等の考察を繰り返しましたが問題が複雑になりお手上げ の状態です。 ちゃんとした解法があるのならお教え頂けるか書籍の 案内をして頂きたいです。宜しくお願いします。

  • アトメルマイコンのSPI通信ISRルーチン書き方

    現在、ATxmega128A1Uのマイコンのプログラムを作成しています。プログラム内でSPI通信のSPIFポートでデータの送受信を行わせている箇所があります。 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/M1601A_20161205/MainUnit/event.c 現在、SPIFポートでのデータ受信は無限ループ内で、 if(SPIF.STATUS & 0x80) このコードでデータ受信の有無を確認して、受信バッファの配列変数に確保するようなやり方を在しています。 しかし、このコードだと受信とデータの送信のタイミングなどを考慮した書き方をしないとけなくて、プログラムが複雑になってしまうような気がしていて、もう少しスッキリさせたいと思い、ATMELのC言語で受信時の割り込み時にSPIFの割り込み時にその割り込みの割り込みルーチンのISR関数に飛ぶようにして、そこで受信データを配列変数に入れていくようにすれば、コードがスッキリするんじゃないかと思っています。 そこで、ISRを描きたいのですが、ISR(SPIFの受信ベクタ名)このSPIFの受信ベクタ名をご教示いただきますよう、宜しくお願い致します。 以前、ATmega88PマイコンでUARTの受信をISRのルーチンで同様のことをやった際のコードを見返してみたら、 ISR(USART_RX_vect) このようなベクタ名を書いていたのですが、この”USART_RX_vect”この文字列がどこのプログラムとリンクしているのか、プロジェクト全体で検索をかけてみても見つかりませんでした。 このベクタ名はどこで確認すれば良いかも教えて頂けると幸いです。

  • 共有PCでのプライバシー保護について

    共有PC内のファイルを整理していました。 メーラーのEUDORAを使っていましたが、不具合があり 数年前にソフト自体を削除しました。 PC内のフォルダに"ATTACH"というものが、残っていました。 (すでに辞めた人が受信したファイルなので削除しました) 実は女性の写真もありました) このフォルダの存在を知らずに削除し忘れていたようで、 データが残っていました。以前にPCを使っていた人が そのまま受信ファイルを残していったようです。 (SPAMかもしれませんし、不明です) 自分も仕事とは関係ないファイルを受信した経験が あるので、かなりあせりました。よからぬ疑いを かけられるのでは。。。と。仕事さぼっているとか・・・です。 (実は少しはたまにさぼっていましたが) プライベートな情報を消すのに、注意する点を どうか教えてください。 ○オートコンプリートをやめる ○ccleanerでファイルを削除する ○共有ファイルにはプライベート情報をおかない ○ログイン時はパスワード管理し、メーラーは使わず webメールのみにする。 今注意しているのはこのくらいです。 素人質問ですみませんが、PCを共有しているので どうかアドバイスをお願いします。 会社を辞めるときに、証拠を残していくを 避けたいのでどうかよろしくお願いします。