Linuxで生成したプロセスに処理をさせるには?

このQ&Aのポイント
  • Linuxで生成したプロセスに処理をさせる方法について教えてください。
  • ネットで調べたり本を読んだりしましたが、解決策が見つからなかったので質問させてください。
  • プロセスに別のプログラムを実行させる方法についても教えてください。
回答を見る
  • ベストアンサー

Linuxで生成したプロセスに処理をさせるには?

Linuxの学んでいる者です。 表題の件について、本を読んだり、ネットで検索したり したのですが、解決ができなかったため質問させて いただきました。 以下に例を挙げます。 1つのCファイルに、「main」と「A」と「B」という関数があるとします。 「main」関数にて、fork()で2つプロセスを生成し、一方のプロセスでは 「A」関数を実行し、もう一方では「B」という関数を実行させます。 「A」という関数は3秒ごとに「1,2,3,…」と数字を出力するもので、 「B」という関数は5秒ごとに「10、20、30、…」と数字を出力するものとします。 こういう場合に、プロセスに「A」や「B」の処理を実行させることができません。 exec関数でプロセスに別のプログラムを実行させることはできますが、 プログラムの実行ファイルのパスを指定して実行させるようなので、 この場合にはうまく使えません。 理解されている方には、本当に些細なことではあると思いますが、 私では解決にまで至らなかったので、ご教授いただければ幸いです。 よろしくお願いいたします。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4845/10256)
回答No.2

単にfork()して子プロセスから呼べばいいです。 if( !(child_a = fork()) ){ A(); exit(0); } if( !(child_b = fork()) ){ B(); exit(0); } とか。

cybms01
質問者

お礼

ご回答いただきありがとうございます。 参考にさせていただきまして、うまく動作させることができました。

その他の回答 (3)

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.4

スレッドじゃだめなんですか? 僕だったらpthread_createで済ましてしまいますね。

cybms01
質問者

お礼

ご回答いただきありがとうございました。 スレッドではできたのですが、プロセスでうまくできなかったので、 質問いたしました。すみません。

回答No.3

> こういう場合に、プロセスに「A」や「B」の処理を実行させることができません。 できます。 > exec関数でプロセスに別のプログラムを実行させることはできますが、 > プログラムの実行ファイルのパスを指定して実行させるようなので、 > この場合にはうまく使えません。 exec系の関数でプロセスを置き換える必要はありません。 #include <stdio.h> #include <sys/types.h> #include <unistd.h> void A( void ) { int n=1; while( 1 ) { printf( "%d\n", n ); ++n; sleep(3); } return; } void B( void ) { int n=10; while( 1 ) { printf( "%d\n", n ) ; n+=10; sleep(5); } return; } int main( void ) { switch( fork() ) { default: A(); break; case 0: B(); break; case -1: printf( "fork error!!!\n" ); break; } return 0; }

cybms01
質問者

お礼

ご回答いただきありがとうございました。 参考にさせていただきまして、うまく動作させることができました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

いろいろ考え方はありそうだけど, プロセス間通信でできることはまちがいない. シグナルでも送り付ける?

関連するQ&A

  • プロセスの生成

    #include<stdio.h> #include <unistd.h> main(){ int i; printf("\t(%s)プロセスID.....%d\n","元",getpid()); printf("\t(%s)親プロセスID...%d\n","元",getppid()); if((i=fork())==0) { //子プロセスで実行する部分 printf("\t子プロセスでのfork()の値 : %d\n",i); printf("\t(%s)プロセスID.............%d\n","子",getpid()); printf("\t(%s)親プロセスID...........%d\n","子",getppid()); printf("子プロセスを終了します\n"); } else{//親プロセスで実行する部分 printf("\t親プロセスでのfork()の値 : %d\n",i); printf("\t(%s)プロセスID.............%d\n","親",getpid()); printf("\t(%s)親プロセスID...........%d\n","親",getppid()); printf("親プロセスを終了します\n"); } } fork関数の振る舞いについてです。 上記のプログラムをgccでコンパイルして実行した場合出力結果が /_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ (元)プロセスID.....375 (元)親プロセスID...246 親プロセスでのfork()の値 : 376 子プロセスでのfork()の値 : 0 (子)プロセスID.............376 (子)親プロセスID...........375 子プロセスを終了します (親)プロセスID.............375 (親)親プロセスID...........246 親プロセスを終了します _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ という感じで出力されました。 fork関数がプロセスの複製を行っていることと、戻り値が0と376の2つであることはわかりました。 また子プロセスには0を親プロセスには376を返すこともわかりました。 感覚的にはif文の真である子プロセス側の記述文と偽である親プロセス側 の記述文が同時に実行されているのではないかと考えましたが 同時に実行されているのに printf("\t子プロセスでのfork()の値 : %d\n",i); printf("\t親プロセスでのfork()の値 : %d\n",i); で表示される値が違うのはなぜでしょうか。 i=fork()によって代入されているのはわかるのですが、 同時に実行されつつ何故2つの違う値をiは出力できるのかがわかりません。 また出力結果が _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ (元)プロセスID.....377 (元)親プロセスID...246 親プロセスでのfork()の値 : 378 (親)プロセスID.............377 (親)親プロセスID...........246 親プロセスを終了します 子プロセスでのfork()の値 : 0 (子)プロセスID.............378 (子)親プロセスID...........1 子プロセスを終了します _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 子プロセスから見たときの親プロセスが1となっているのは何故でしょうか? 本来ならば377ではないでしょうか? わかりにくい説明ですいません。 よろしくお願いします。

  • 子プロセスの管理

    forkした後の子プロセス管理で、終了をsignalで管理しようと思ってるんですが、forkを2回行なえばゾンビ化を防げると書いてありました。この二つの方法に違いはあるんですか?メリット・デメリットがよくわかりません。ちなみに子プロセスからの結果や終了を待つ様なプログラムではなく、ただexec関数での別処理を行なうために子プロセスを作成するだけです。 宜しくお願いします。

  • 子プロセスと親プロセス

    ある本を読んでいると、以下のような問いにぶち当たり、プログラムの仕方がよくわからないのです。 自分でもいろいろ調べたのですが、わからないので質問させていただきます。 自分のプロセスIDと親のプロセスIDのプロセスIDを表示するコマンドshowpidを作り、showpidを子プロセスとして10回実行するプログラムを作りなさい。ただし、execを用いてshowpidを10回実行すること。 というものなのですが、自分のプロセスIDと親のプロセスIDの表示方法はわかったのですが、それをコマンドとして作り、子プロセスとして10回実行する方法がわからなくて困っております。。。 言語はc言語を使ってもらいたいです。以下に自分のプロセスIDと親のプロセスIDを表示するプログラムを付けときます。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main(){ pid_t pid; int status; if((pid=fork())==0) printf("I am a child with pid=%d. My parent pid is %d.\n",getpid(),getppid()); else{ wait(&status); exit(EXIT_SUCCESS); }

  • 子プロセスのデータを親プロセスに渡す方法ってありますか。

    こんにちは。 C言語内でfork()関数を使い親と子を分け、子プロセス間で生成されたデータを親プロセス側に渡して処理したいと考えています。要は、プロセス間でデータのやり取りをpipe()関数かなにかで行いたいと思っています。 子プロセスがデータをテキストファイルでどこかに出力して、それを親プロセスが参照する、というテキストファイルを橋渡しにする原始的な方法があるにはあるのですがこれは最終手段にしたいと考えています。他に良いやり方があればご教授いただけないでしょうか。 以下はサンプルコードです。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<errno.h> #include<signal.h> #include<sys/types.h> int main(){ FILE *fp,*fp2; int fd[2],a,i = 0; pid_t pid; pipe(fd); char buff[1024]; pid = fork(); sigignore(SIGCLD); //ちゃんと子が死ぬようにする if(pid == 0){ close(STDOUT_FILENO); //画面に出力されないようにする dup2(fd[1],STDOUT_FILENO); close(fd[0]); fp = popen("tcpdump","tcpdump","tcp[13] & 255 == 2",NULL); } else{ sleep(1); //一秒だけ子プロセスを起動 kill(pid,SIGTERM); wait(); //完全に子プロセスを殺す fp2 = popen("wc -l fpのファイルデータ","r"); for(i=0;i<3;i++){ a = fgetc(fp2); putc(a,stdout); }printf("\n"); return 0; } } プログラムの内容は、 tcpdumpで処理(子プロセス)した内容を、wc -l で「行数」のみ取得する(親プロセス)というものです。あくまで目標ですが・・。^^; お手数でしょうが、どうぞよろしくお願いします。

  • fork、exec系、wait系のシステムコール(ライブラリ関数)でのシェル

    簡単なシェルを fork、exec系、wait系のシステムコール(ライブラリ関数)を利用して作りたいですがどのようなソースになるでしょうか? 最低限、以下の機能を実現しなければなりません 1.プロンプトを出力する 2.ユーザに端末からコマンドを入力させる 3.新しくプロセスを生成し、そのプロセスが入力されたコマンドのプログラムを実行する 4.そのコマンドの実行(子プロセス)が終了するまでシェル(親プロセス)は、プロンプトを出さずに待つ 5.1に戻る どうやってもうまくいかないので教えていただけないでしょうか

  • プロセスを生成や実行する時に内部でどんな処理が行われていますか?

    最近 「Lions' Commentary on UNIX」 という本がわかりやすいと薦められて読んでいますが ぶっちゃけよくわからずに読み進めています。 その本のなかでnewproc()という関数のコード解説があったのですがやはりよく理解できませんでした。 結局「プロセスを実行する」という処理は内部でどういう操作が行われているのでしょうか?上記の本を読んだ感じでは結局メモリに実行ファイルをロードしただけなんじゃないかという気がします。 もちろんそれだけではプロセスは走らないとは思いますが、具体的に何をどうすれば「プロセスが走り出す」状態になるのでしょうか? よろしくお願いします。

  • 別のプロセスの関数を呼び出す方法はありますか?

    別のプロセスの関数を呼び出す方法はありますか? WINDOWSでプロセスAとプロセスBがあり、 プロセスBの関数ポインタをプロセスAで取得するところまではできるのですが、 この後、プロセスAからプロセスBの関数をコールバックする方法はありますか? アドレス空間はプロセスごとに固有であるため、 通常のコールバックではうまくいかないと思うのですが・・・。 尚、プロセスAとプロセスBは、異なるプログラムです。

  • スレッドについて

    JAVAでプログラムを書く上で、Aという処理が終了次第、Bという処理を実行したい場合どうすればいいのでしょうか? ///////////////////////////////////////////////////////////////// 例えば、 ・ファイルにデータを出力する。(例えば、バッチファイルhoge.batとして) その後、すぐに ・そのバッチファイルを実行する命令を書く(Runtime.exec(hoge.bat); ///////////////////////////////////////////////////////////////// このプログラムを実行した場合、スレッドAがファイルにデータを出力し終わる前に勝手にスレッドBが作られ、Runtime.exec(hoge.bat);が実行されてしまいます。正しくスレッドAが終了し終わった後にスレッドBが実行し始めるようにするにはどうすればいいのでしょうか?教えてください。お願いします。

    • ベストアンサー
    • Java
  • remove関数(?)でプロセスが停止する。

    remove関数(?)でプロセスが停止する。 すみません。とても困っています。 ご存知でしたら、教えてください。 現在、linuxでc言語のプログラミングをしています。 元々、以下のディレクトリがあるとします。 /var/tmp/etc 2つのプロセスがあり、それぞれA、Bとします。 プロセスA内の一つのスレッドで、 remove("/var/test.dat")を実行し削除するようにプログラムしています。 また、プロセスB内の1つのスレッドで、 system("mkdir /var/tmp/etc/test1)とし、test1ディレクトリを 作るようプログラムしています。 実行し、普通に動いていたのですが、 このremove関数とsystem(mkdir)関数が同時?に実行(バッティング)すると そこでピタッと処理がとまってしまい、 (↑ログを仕込んで調べてみました。確実ではありませんが、同時に起きる時に 大体とまっていると推測しています。) /varディレクトリにすらアクセスできなくなってしまいます。 (cd var で lsコマンドを叩くと何も表示されないし、リターンもない) この現象を回避したいのはしたいのですが、 まず原因を知りたいと思っています。 remove関数とsystem(mkdir)関数が同時に走るとなぜだめなんでしょうか? すみませんが、いくら調べてわかりませんでした。 ご教示いただけると助かります。 以上、よろしくお願いいたします。

  • remove関数(?)でプロセスが停止する。

    remove関数(?)でプロセスが停止する。 すみません。とても困っています。 ご存知でしたら、教えてください。 現在、linuxでc言語のプログラミングをしています。 元々、以下のディレクトリがあるとします。 /var/tmp/etc 2つのプロセスがあり、それぞれA、Bとします。 プロセスA内の一つのスレッドで、 remove("/var/test.dat")を実行し削除するようにプログラムしています。 また、プロセスB内の1つのスレッドで、 mkdir("mkdir /var/tmp/etc/test1, mode)とし、test1ディレクトリを 作るようプログラムしています。 実行し、普通に動いていたのですが、 このremove関数とmkdir関数が同時に実行(バッティング)すると そこでピタッと処理がとまってしまい、 (↑ログを仕込んで調べてみました。確実ではありませんが、同時に起きる時に 大体とまっていると推測しています。) /varディレクトリにすらアクセスできなくなってしまいます。 (cd var で lsコマンドを叩くと何も表示されないし、リターンもない) この現象を回避したいのはしたいのですが、 まず原因を知りたいと思っています。 remove関数とmkdir関数が同時に走るとなぜだめなんでしょうか? すみませんが、いくら調べてわかりませんでした。 ご教示いただけると助かります。 以上、よろしくお願いいたします。

専門家に質問してみよう