中小企業の働き方改革をサポート>>

Ubuntu LinuxでTCPクライアント通信を行うプログラムをgccで作成しています。
現在、特定のサーバーに対して接続して数十秒ごとに1kバイト程度のパケットを送信するプログラムを1つ作りました。

その後、キーボードのキー入力に応じて、そのキー操作のログテキストファイルを出力プログラムも作りました。


それぞれのプログラムをgccでコンパイルして2つの実行ファイルが作成されました。
キー操作のログテキストファイルをの内容に応じてTCP通信側のプログラムが送信するパケットの内容を変えたいと思っているのですが、この場合片方の実行ファイルを起動した場合に、もう一つの実行ファイルも起動するようにするにはどうしたら良いかご教示頂けないでしょうか?


どうぞ、よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>この場合片方の実行ファイルを起動した場合に、もう一つの実行ファイルも起動するようにするにはどうしたら



両方のプログラムを起動するシェルスクリプトを作成する。
ってところでしょうかね。

まぁ、それぞれのプログラムを起動させるプログラムを作る。
という方法もあるでしょうが。

なお、バックグラウンドで動作させるようにしないと、起動したプログラムが終了するまで次のプログラムが起動しない。
なんてコトになるのでご注意を。

ユーザーからの操作が必要っぽいので、「TCPクライアント通信を行うプログラム」とやらをバックグラウンドで起動、続けて「キー操作のログテキストファイルを出力プログラム」をフォアグラウンドで実行となるでしょうね。
# バックグラウンドで動作しているプログラムをどうやって終了させるか。
# というのもあらかじめ調べておきましょう。

あとは……
>ログテキストファイルをの内容に応じてTCP通信側のプログラムが送信するパケットの内容を変えたいと思っている
ファイルのオープン時の共有や排他制御とかには注意ですかねぇ。
片方が書き込んで、もう片方がちゃんと読めるか?とか…。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。その後、いろいろと複数タスクを動作させていくようなやり方をいろいろと調べてみたところ、実行ファイルを複数動作させるというやり方というのとスレッドというやり方forkというやりかたなどなどがあることがわかってきました。現在自分はソースコードなどを自由に編集したり作ったりすることができるのでスレッドでのプログラミングがやってみたいと感じてきました。複数実行ファイル起動というのもシェルスクリプトっていうバッチみたいな物を活用することでできるのですね。ただ、ファイルの排他制御というのはかなり課題になるのですね。

詳細頂きありがとうございました。シェルスクリプトでの複数実行は今後やってみたいです。

お礼日時:2014/05/18 16:01

No1が言うとおり、、2個起動した時、


最初に起動したほうをどうやって終わるか?は
ありますね。
ps axでプロセス探してkill するとか?

アプリの起動自体は
./recv & < &で強制起動
./send こっちは&つけずそのまま、クライアントからの入力待ち。。
が、ごっちゃごっちゃ(w)

他のPCから、アクセスしているのであれば、
コンソールを2個まともに開いちゃえば、画面に直接だせてテストしやすいかもですが。
受け側がprintf 出来るので、かなりデバッグが楽です。
ですが、1つのコンソールでやってるんですよね?

<過去に似た事やった事があったんですが、忘れました。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。その後、いろいろと複数タスクを動作させていくようなやり方をいろいろと調べてみたところ、実行ファイルを複数動作させるというやり方というのとスレッドというやり方forkというやりかたなどなどがあることがわかってきました。現在自分はソースコードなどを自由に編集したり作ったりすることができるのでスレッドでのプログラミングがやってみたいと感じてきました。複数実行ファイル起動というのもシェルスクリプトっていうバッチみたいな物を活用することでできるのですね。ただ、ファイルの排他制御というのはかなり課題になるのですね。

詳細頂きありがとうございました。シェルスクリプトでの複数実行は今後やってみたいです。

お礼日時:2014/05/18 16:01

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q英語で「個数」「件数」は?

質問は単純です。
英語で「個数」や「件数」をなんというか、です。

とりあえず、思いついたのは、numberでした。
たとえば、「りんごの個数」は"a number of apples"ですか?
でも、"a number of"は「いくつかの」という意味ですよね。

「データの件数」は"a number of data"でしょうか?

私は英語はほとんど出来ませんが、numberは「個数」というよりも「番号」という意味であるような気がしてなりません。

Aベストアンサー

>「個数」や「件数」をなんというか、です。
>とりあえず、思いついたのは、numberでした。
意外に思われるかもしれまんせんが、語の選択はnumberであっています、と思います。

>「りんごの個数」
the number of (the) apples

>「データの件数」
the number of (the) data

>numberは「個数」というよりも「番号」という意味であるような気がしてなりません。
実は、昔、私も、「個数や件数はなんていうのかな、え、number? え、本当?」と、奇異に感じたことを、思い出しました。

Qセグメントエラー

Cプログラムを実行した時に発生する、セグメントエラー
は何が原因なのでしょうか?
コンパイルはちゃんとととっているのに、
なぜエラーがでるのでしょうか?
C言語の本を見たのですが、
のってません。
お願いします。

Aベストアンサー

こんにちわ。

「セグメントエラー」ってSegmentation Fault の事ですよね。
そうであれば、メモリのアクセス侵害です。
原因としては、
・アクセスできない筈のアドレス (NULL アドレスとか) にアクセスした
・獲得したアドレスを越えてアクセスした。
・初期化していないポインタ変数を使ってアクセスした。
と言う感じです。

ケースとしては少ないと思いますが、1つの変数 (領域) を複数の
データ型でアクセスした場合に、起きる事があります。

Q複数テキストファイルを読み込み、複数テキストファイルの出力

質問は100個のテキストファイル(それぞれ10個のデータを含む)を読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するというプログラムについての質問です。
以下が僕の作ったファイル出力部分のプログラムです。

/************/

void ecg_rr(fp,data_max)

FILE *fp;
{
int b,i=0;
int c=1;
char fname[64];

data[0][i]=trend_data[0][i];

for(i=0;i<100;i++)

sprintf(fname,"ss[%d].txt",1+i);

fp = fopen(fname,"w");
fprintf(fp,"%4d\n",c);
fprintf(fp,"%8.8f\n",data[0][0]);
fprintf(fp,"%8.8f\n",data[0][2]);
fprintf(fp,"%8.8f\n",data[0][4]);
fprintf(fp,"%8.8f\n",data[0][6]);

fclose(fp);

sprintf(fname,"sk[%d].txt",1+i);

fp = fopen(fname,"w");
fprintf(fp,"%4d\n",c);
fprintf(fp,"%8.8f\n",data[0][1]);
fprintf(fp,"%8.8f\n",data[0][3]);
fprintf(fp,"%8.8f\n",data[0][5]);
fprintf(fp,"%8.8f\n",data[0][9]);

fclose(fp);


}

複数ファイルの読み込み方がわからず、自分のプログラムだと1つのテキストファイルしか読み込めないので、16_4.batを作り、その中身を
16_4 読み込むテキストファイル名1.txt ss[1]
16_4 読み込むテキストファイル名1.txt sk[1]

16_4 読み込むテキストファイル名2.txt ss[2]
16_4 読み込むテキストファイル名2.txt sk[2]
・・・
とやったのですが、うまくいきませんでした。
どうすればよいのでしょうか。

質問は100個のテキストファイル(それぞれ10個のデータを含む)を読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するというプログラムについての質問です。
以下が僕の作ったファイル出力部分のプログラムです。

/************/

void ecg_rr(fp,data_max)

FILE *fp;
{
int b,i=0;
int c=1;
char fname[64];

data[0][i]=trend_data[0][i];

for(i=0;i<100;i++)

sprintf(fname,"ss[%d].txt",1+i);

...続きを読む

Aベストアンサー

>read_dataの呼び出しは上位レベルのものを直接
>sprintf(fname,,"ss[%d].txt",1+i);
>の後に代入すればよいでしょうか?
私には、上位レベルがどうなっているのかわかりませんので、判断がつきませんが、その前の方がいいと思います。
例:
for(i=0;i<100;i++)

sprintf(fname,"読み込むテキストファイル名%d.txt",i+1);
fp=fopen(fname,"r");
read_data(fp); /* リターン値を使う必要あり? */
fclose(fp);

sprintf(fname,"ss[%d].txt",1+i);

Q複数ファイルの同時読み込みの方法と脱初心者向け参考書

ループにて、複数のファイル(.txt)を同時に読み込む方法はあるのでしょうか。(厳密に言えば、完全に同時ということではなく、時間差をつけてということ)。以下のプログラムではループ自体が行われていないようでした。while分とfreadの使い方に問題があると思うのですが…

~略~

int a,b;
FILE *fp1,*fp2;

fp1 = fopen(…,"r");
if(fp1 == NULL)
{・・・;}

fp2 = fopen(…,"r");
if(fp2 == NULL)
{・・・;}

while((a = fread(…,1,8,fp1)) != 0)
{
while(fread(…,1,8,fp2))
{

~略~

}
}

fclose(fp1);
fclose(fp2);

以下略~

また、2つ目のwhileを削除し次のようにすると1つ目のファイル(fp1)は読み込めるのですが、2つ目のファイル(fp2)が読み込めていないようでした。

~略~

while((a = fread(…,1,8,fp1)) != 0)
{
b = fread(…,1,8,fp2);

以下略~

解決方法を教えていただけないでしょうか。

次にいわゆる脱初心者向け(?)ともいえる参考書について。
初心者向けの入門書に載っている関数についての説明などは、どれも最も基本的な機能についてのものがほとんどで、少し応用したものは載ってません。

また、多少上級向けになると、例えば「int sprintf(char *buf,const char *format,…)」や、「int printf(const char *format,…)」といった具合にいかにも専門書らしくなっています。また使用例も、他に見たこともない関数が同時に出てきてまるで手がつけられません。

それはそれで重要なことであるのはわかるのですが、「sprintf(s,"%d%d",a,b) s文字配列、a,b整数値」という理解しやすい書き方をあわせて載せてある、「関数辞典」みたいな参考書とかは市販されているのでしょうか。私の理想通りの物とまでは言いませんが、お薦めのものを推薦していただければ幸いです。

よろしくお願いします。

ループにて、複数のファイル(.txt)を同時に読み込む方法はあるのでしょうか。(厳密に言えば、完全に同時ということではなく、時間差をつけてということ)。以下のプログラムではループ自体が行われていないようでした。while分とfreadの使い方に問題があると思うのですが…

~略~

int a,b;
FILE *fp1,*fp2;

fp1 = fopen(…,"r");
if(fp1 == NULL)
{・・・;}

fp2 = fopen(…,"r");
if(fp2 == NULL)
{・・・;}

while((a = fread(…,1,8,fp1)) != 0)
{
while(fread(…,1,8,fp2))
{

~略...続きを読む

Aベストアンサー

関数の使い方の問題でなく、考え方の問題かも。

> FILE *fp1,*fp2;

ファイルは「本」、ファイルポインタは「しおり」と例えます。
複数(仮に5冊)の本を読むのに、ファイルポインタを2つ宣言しています。
2枚のしおりをどう使えば、5冊の本の全てのページを網羅する事ができるでしょうか?

って事を考えると、しおりが2枚なのは誤りで、5枚のしおりを使うか、1枚のしおりを使いまわすかの方が良いと思いませんか?

--
または、5冊の本の題名を書いた別の5ページ本が1冊あるのなら、何枚のしおりをどう使えば良いか?って事とか。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QC言語のfopenについて教えてください。

C言語のfopenについて教えてください。

ある1つのファイルをr(テキストファイル読み込みモード)でfopenしたとします。
そのファイルをfcloseする前に、同じファイルが再度rモードでfopenされても問題ないのでしょうか?

何を気にしているかと言いますと、あるプログラムであるファイルをrモードでfopenして読み込む処理があるのですが、そのプログラムを呼び出す処理が複数あります。
確率は低いと言えど、もし同時にその処理が実行された場合、rモードでfopenしているファイルにfclose前に再度rモードのfopenがされたらエラーとなってしまうのでしょうか?
もし、エラーとなる場合、回避する方法がありますか?
また、エラーとならない場合は、fcloseするまで次の処理が待ってしまうのでしょうか?

読み込みモードだから問題ないのかなとも思ったのですが、どなたかご存知だったら教えてください。

よろしくお願いしますm(_ _)m

Aベストアンサー

同じプロセス内の話ならオープンしたファイルハンドルごとで
ファイルハンドルは管理しているので
開きっぱなしでもオープンできる限りはエラーになりません。
ただし、同時にオープンできるファイル数には限界があるので
無尽蔵に開き続けるような場合にはいずれオープンに失敗します
(そういうerrnoがあったはず)
オープンできる限界については
プロセスごとと、OS(カーネルパラメータ)の2段階だった予感

なので、1つのプログラムならば
オープンしたファイルのパス名とハンドルを別管理する等
同じファイルの複数オープンは修正しておいた方がいいと思うけれど
複数のプログラム(実行モジュール)でアクセスしていて
変更できないのなら仕方ないですね。

ただ、
読み取り中に変更されてしまう可能性と変更されると都合悪い場合には
考え直した方がよいですね。
起動元でファイル名にシーケンス番号をつけて渡してあげるとかして
そのファイル名をユニークしてあげるとか


人気Q&Aランキング

おすすめ情報