私はLinuxを始めたばかりのタコです。
参考書で少しずつ勉強しているのですが
「プロセスの生成にはforkを使用する」と記載されており
プログラム例も載ってはいるのですが親プロセスと子プロセス一個の
ケースしか記載されていません。
例にはPIDが0か0以外で親子を判断して別処理をさせると書いてありました。
例えば親プロセスと子プロセス2個以上を生成するにはどうしたらいいのでしょう?超ビギナーな質問で申し訳ありませんがタコを育てると思って
どうか御教え下さい。宜しく御願いします。

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

A 回答 (3件)

下記のお答え。


んんんと、それだと最後に作成されたプロセスで、forkの戻り値が0なので、ifを通らないままforを抜けて、何もしないプロセスになってしまうような・・・。

for(n = 0; n < 2; n++){
if(pid[n] = fork) break;
}

switch(n){
case文で0~3 (←3までであることに注意)
}

とすると、forループを抜けた時点で、

(1) nに0が入っている、親プロセス
(2) nに1が入っている、(1)プロセスに作られた子プロセス
(3) nに2が入っている、(2)プロセスに作られた子プロセス
(4) nに3が入っている、(3)プロセスに作られた子プロセス

ができます。
どういう経緯をたどるかというと、

(1) 親プロセスはn=0をセットし、forkの戻り値にIDが入るのでブレーク、forを抜けたあとのnは0。
(2) n=0のループでforkを呼び出した時点でプロセスが複製され、forkの戻り値が0なので、ブレークせずにnがインクリメントされn=1に。そしてforkを呼び出し、プロセスIDが返り、真なのでブレーク、forを抜けたあとのnが1。
(3) n=1のループでforkを呼び出した時点でプロセスが複製され、forkの戻り値が0なので、ブレークせずにnがインクリメントされn=2に。そしてforkを呼び出し、プロセスIDが返り、真なのでブレーク、forを抜けたあとのnが2。
(4) n=2のループでforkを呼び出した時点でプロセスが複製され、forkの戻り値が0なので、ブレークせずにnがインクリメントされn=3に。そしてn>2なのでループを抜け、forを抜けたあとのnが3。

というわけでforを抜けたあとswitchで判別するといいと思います。
これは自分でやったことであり、参考書とかを見たわけではないので、これが一番正しいとは言えないのですが、動作はしました、perl上ですが(笑)。
でもどの言語でも同じだと思います。

ちなみにperlではpid[n]には、あとのプロセスのIDは格納されません。
たとえばn=0のプロセスではpid[1]は入っていませんでした。
どうやら、複製されたプロセスで、変数は共有されていないようです。
もちろん、この部文はほかの言語でどうなるかわかりませんが。

if(!(pid[n]) = fork()) break;
とすると、いちばん最初のプロセス(n=0)だけのpid[n]にすべてのプロセスIDが格納されました。
プロセスを作成するのは最初のプロセスだけですから。

長くなりました。
参考になれば嬉しいです。
    • good
    • 0
この回答へのお礼

大変参考になりました。詳しく教えて頂いてありがとうございました。

お礼日時:2002/01/21 21:03

forkはこれを呼び出した時点で、そのプログラムのメモリ内容をすべてコピーしたプロセスの複製を作ります。


ただし、1つだけ違う個所があります。
それはforkの戻り値です。

間違えやすい例を。

fork();
fork();

1個目のforkで2つのプロセスに別れ、その2つが2個目のforkを呼び出すので結果4つできてしまう。

for(n = 0; n < 2; n++){
if(fork()) break;
}

というふうにやると、子プロセスが2つできます。
ちなみに、Cの質問なのかシェルスクリプトの質問なのかわからなかったので、言語は適当です。
適当に解釈してください。

この回答への補足

分かり易い例を書いて頂いてありがとうございます。
下記の様につくればよいのでしょうか?
pid_t pid[2];
for(n=0;n<2;n++){
if(pid[n] = fork()){
switch(n){
case 0:
処理A(system("他に作成したプログラム")等)
      break;
case 1:
処理B
      break;
default:
break;
}
break;
}
}

補足日時:2002/01/16 19:55
    • good
    • 0
この回答へのお礼

分かり易い例を書いて頂いてありがとうございます。
下記の様につくればよいのでしょうか?
pid_t pid[2];
for(n=0;n<2;n++){
if(pid[n] = fork()){
switch(n){
case 0:
処理A(system("他に作成したプログラム")等)
   break;
case 1:
処理B
   break;
default:
break;
}
break;
}
}

お礼日時:2002/01/17 15:14

必要な個数分、fork()を繰り返して呼び出せばよいと思うのですが、


それではいけませんか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ちょっと試してみます。

お礼日時:2002/01/16 20:05

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Qforkについて

fork文を使った問題について質問です。


#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
pid_t pid1,pid2;
if((pid1 = fork()) == 0)
printf("I am a first child with pid = %d,My parent pid is %d.\n",getpid(),getppid());
else if(( pid2 = fork()) == 0)
printf("I am a second child with pid = %d,My parent pid is %d.\n",getpid(),getppid());
else
printf("I am a parent with pid = %d.\nMy first and second children are %d and %d.\n",getpid(),pid1,pid2);
exit(EXIT_SUCCESS);
}


このようなプログラムが与えられました。
問題は
1.このプログラムを改造して、1つの親プロセスから100の子プロセスを順に生成するプログラムをつくるというものと
2.1つの親から子プロセスを生成し、その子プロセスの孫プロセスを生成するプログラムをつくれというものです。

1はfor文を使えばできそうなのですが、forkの基礎が出来ていないのでどうループを回せばよいか分かりません。
2もfork内でforkを実行すればできそうだと思ったのですがうまく動かず・・・。

どうか正しく動くようなプログラムを教えてください!お願いします。

fork文を使った問題について質問です。


#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
pid_t pid1,pid2;
if((pid1 = fork()) == 0)
printf("I am a first child with pid = %d,My parent pid is %d.\n",getpid(),getppid());
else if(( pid2 = fork()) == 0)
printf("I am a second child with pid = %d,My parent pid is %d.\n",getpid(),getppid());
else
printf("I am a parent with pid = %d.\nMy first and second children are %d a...続きを読む

Aベストアンサー

ざっと書いてみました。
1. fork
-> 親プロセス) 子プロセスの終了を待ち、再びfork
-> 子プロセス) 自身のプロセスIDを表示し、直ちにexit
2. fork
-> 親プロセス) 子プロセスの終了待ち
-> 子プロセス) 再びfork、孫プロセスの終了を待ち、直ちにexit
-> 孫プロセス) 直ちにexit
上のような流れのプログラムです。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void problem1(void); /*問題1*/
void problem2(void); /*問題2*/
pid_t Fork(void); /*forkのエラーをトラップするラッパ関数*/
void Wait(int *status); /*waitのエラーをトラップするラッパ関数*/

int main(void)
{
problem1();
problem2();
return 0;
}

void problem1(void)
{
int i;
pid_t pid;
for(i=0 ; i<100 ; i++)
{
printf("loop %d\n" , i);
pid = Fork();
if(pid == 0) /*child process*/
{
printf("child %d\n" , getpid());
exit(EXIT_SUCCESS);
}
/*parent*/
Wait(NULL); /*wait for child*/
}
}

void problem2(void)
{
pid_t pid0;
pid_t pid1;
pid0 = Fork();
if(pid0 == 0) /*child*/
{
printf("child.\n");
pid1 = Fork();
if(pid1 == 0) /*grand child*/
{
printf("grand child.\n");
exit(EXIT_SUCCESS);
}
/*child*/
Wait(NULL); /*wait for grand child*/
exit(EXIT_SUCCESS);
}
/*parent*/
Wait(NULL); /*wait for child*/
}

pid_t Fork(void)
{
pid_t pid = fork();
if(pid < 0)
{
perror("fork");
exit(EXIT_FAILURE);
}
return pid;
}

void Wait(int *status)
{
if(wait(status) < 0)
{
perror("wait");
exit(EXIT_FAILURE);
}
}

ざっと書いてみました。
1. fork
-> 親プロセス) 子プロセスの終了を待ち、再びfork
-> 子プロセス) 自身のプロセスIDを表示し、直ちにexit
2. fork
-> 親プロセス) 子プロセスの終了待ち
-> 子プロセス) 再びfork、孫プロセスの終了を待ち、直ちにexit
-> 孫プロセス) 直ちにexit
上のような流れのプログラムです。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void problem1(void); /*問題1*/
void problem2(void); /*問題2*...続きを読む

QWindowsでのfork方法

Windowsプログラムで、UNIXライクなマルチプロセス処理を書きたいのですが、
fork()が使えないようで、代替の方法がわかりません。
CreateProcess()というAPIはありますが、これは単に実行モジュールの呼び出し
を行う関数で、UNIXのようなfork()でプロセスを分けるものでは
ないようです。

子プロセス内部で、構築済みのDLLを複数ロードしたいのですが、
そのDLLはマルチスレッド対応になっていないため、
マルチスレッド処理はできません。

具体的にやりたいと思っていることをプログラム的に書くと、
およそ以下のような処理です。(UNIXでよくやる手法です)

-----
実行処理のメイン()
{
 int p_pid[128];

 for(int i=0; i<10; i++) {
  switch(pid[i]=fork()){
   case 0: // 子プロセスとしての処理
    子プロセスが呼び出す関数();
    exit(0);
   case -1:
    break;
   default:
    break;
  }
 }
}

void 子プロセスが呼び出す関数()
{
 LoadLiblary() と GetProcAddress() で、DLLを動的にロードし、
 DLL内のAPIを呼び出す。
 DLLがマルチスレッド対応でなくても、この関数は各々が別プロセスとして
 複数同時実行されるので、問題なく処理できるはず。
}

-----

この処理は、Windowsでは無理なのでしょうか?

もしできるなら、Windowsで用意されているランタイムライブラリかAPIを
教えていただけないでしょうか?

よろしくお願いします。

Windowsプログラムで、UNIXライクなマルチプロセス処理を書きたいのですが、
fork()が使えないようで、代替の方法がわかりません。
CreateProcess()というAPIはありますが、これは単に実行モジュールの呼び出し
を行う関数で、UNIXのようなfork()でプロセスを分けるものでは
ないようです。

子プロセス内部で、構築済みのDLLを複数ロードしたいのですが、
そのDLLはマルチスレッド対応になっていないため、
マルチスレッド処理はできません。

具体的にやりたいと思っていることをプログラム的に書くと...続きを読む

Aベストアンサー

Cygwin を使うのが一つ。
もうひとつは「子プロセスが呼び出す関数」を一つの実行モジュールとして作成し、それを CreateProcess (または _beginthread 等)で起動することになります。

Qsleep()関数について

"数秒おきに警報をn回鳴らすプログラム"をC言語で作成しようと
考えています。

プログラム実行環境はWindowsですが、
sleep()関数は使用できないのでしょうか??

仮に使用できない場合、この関数に代わる関数や代替方法が
あれば教えて頂けませんでしょうか? 宜しくお願いします。

Aベストアンサー

正確な動作でも構わなければ
windows.hをインクルードして
Sleep()関数を使いましょう.
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200207/02070061.txt

しかし,正確に数秒おきに動作を行いたい場合はマルチメディアタイマ等を使いましょう.
マルチメディアタイマはミリ秒間隔でコールバック関数を呼び出すことができます.
timeSetEventを用いてコールバック関数の登録を行うことができます.
timeKillEventでコールバック関数の解除を行うことができます.

多分他にも方法があると思うのですが…私はこれぐらいしか知りません^^;

参考URL:http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/time.html

QプロセスIDの取得方法 

Unix C++でプロセスIDの取得方法を教えてください。
(見当違いの質問だったらすみません)
親プロセス(自分)のプロセスIDと、親プロセスの起動した子プロセスのプロセスIDを取得したいです。
また、親プロセスの起動した子プロセスのプロセスIDを使って親プロセス終了時に子プロセスをkillしたいと思うのですが、
具体的にどうすればいいかわからず困っています。

Aベストアンサー

プロセスを殺す処理は kill() を使いましょう、と toysmith さんが
書いてましたね。

  kill(pid_c, SIGTERM);

です。

補足で「sig_handler とは?」とありますが、それはシグナルを処理する
為に書いた関数の名前です(関数名は何でもいい)。

一度、シグナルの処理をしてしまうと、初期状態に戻されてしまうので、
sig_handler() の中でも、signal() を使って、再登録しています。

Qソケット通信でチャットプログラム(unix c言語)

c言語のソケット通信でチャットプログラムを作り中です
仕様:あるクライアントからメッセージがサーバに送信された時点でサーバは接続されたいる全てのクライアントにメッセージを送信する。

以下のようにクライアントからの接続(accept)がある度に、その返り値であるファイルディスクリプタにに対するreadと全クライアントに対するwriteの処理を行うchild関数をforkで起動します。これだとforkが起動した時点での全てのファイルディスクリプタ(接続されている全クライアント)の情報をchild関数に渡せますが、それ以降増え続けていくファイルディスクリプタの情報をchild関数に渡せないので、最初の方に接続したクライアントからのメッセージをそれ以降接続した他のクライアントに送信できないという状態です。

main()
{
  socket()
  bind()
  listen()
    while(1){
      accept()
      if(fork()==0) {
       child()
      }
    }
}

child()
{
  select()
  if(FD_ISSET()) {
    read()
    write()
  }
}
※forkやソケット通信に関してかなり初心者なので、ソースや説明分が意味不明かもしれませんがよろしくお願いします。

c言語のソケット通信でチャットプログラムを作り中です
仕様:あるクライアントからメッセージがサーバに送信された時点でサーバは接続されたいる全てのクライアントにメッセージを送信する。

以下のようにクライアントからの接続(accept)がある度に、その返り値であるファイルディスクリプタにに対するreadと全クライアントに対するwriteの処理を行うchild関数をforkで起動します。これだとforkが起動した時点での全てのファイルディスクリプタ(接続されている全クライアント)の情報をchild関数に渡せます...続きを読む

Aベストアンサー

子プロセス自身がその他の子プロセスにデータを出すのではなくて、一度親プロセスにデータを渡し、親プロセスが全ての子プロセスにデータを配信するように作ればいいと思います。親プロセス側は子プロセスと pipe() で繋げばいいんじゃないでしょうか。(UNIX系OSの場合。でもその他のOSでもパイプってありますよね?)

ちなみに accept() で接続がなかったときに停止させないようにする方法は fcntl() で O_NONBLOCK を設定すればできます。pipe() の入出力でデータがないときに停止させないようにするには select() を使えばできます。

Qマルチスレッドとマルチプロセスの違い

マルチスレッドとマルチプロセスの違い
は例えて言うなら1つのプロセスをデュアルコアで処理するのがマルチスレッドで
2つのプロセスをシングルコアで処理するのがマルチプロセスってことでいいですか?

Aベストアンサー

結論から言えば、間違っています。
ただ、そのとらえ方は、あながち的外れでもないというところでしょうか。

まず、正解からいえば、文字通り、
マルチスレッド=複数のスレッドを並行して実行すること
マルチプロセス=複数のプロセスを並行して実行すること
です。
ちなみに、コア数は関係ありません。シングルコアでも、マルチスレッドでもマルチプロセスでも可能。

ということで、では、プロセスとかスレッドとかは何? ということになりますので、これは、詳しく勉強してみるといいと思います。

イメージとしては、もしも、Windows を使っているのであれば、タスクマネージャの、「プロセス」タブをみてください。

ここで、一覧表示されている一つ一つが「プロセス」です。
そして、「スレッド」という項目があると思います。
(標準では表示されていないかもしれません。この場合、表示メニューから、「列の選択」を選ぶと、その中に、「スレッドの数」というのが存在します。)
ひとつのプロセスに、ひとつ以上の「スレッド」があるのがわかると思います。
スレッドというのは、こういう単位です。

今の Windows は、プロセスとして表示されている物を並行して実行しています。そして、個々のプロセスは、ひとつ以上のスレッドを持ちます。
スレッドというのは、直訳すれば、「糸」で、「処理の道筋」を意味します。メールソフトや、掲示板で、議論の流れを「スレッド」と表現する場合もありますが、これも、意味としては同じような物です。

ひとつのプロセスの中にも、いろいろな処理があります。
たとえば、ブラウザで、こういう文章の入力を処理していたり、それと並行して、サーバーにつないで、ページが更新されてないか確認して、さらに、別のところでは、画像をダウンロードしているかもしれません。
それらのひとつひとつがスレッドだと思って、大きな間違いはありません。
マルチスレッドが可能であれば、ひとつのブラウザで、コメントを読みながら、ページを表示しながら、ダウンロードしながら、どこかのサイトからストリーミングされている音楽を鳴らすことができるのです。

一方、こうして、ブラウザでコメントを読んでいる間に、別のソフト(たとえばメールソフト)が、メールを受信しているかもしれません。
これが、別個のソフトで実行されていれば、それぞれは、別のプロセスとして動いている(可能性が高い)わけです。

その意味で、
・ひとつのプロセスの中の処理を並行しているのがマルチスレッド
・別々のプロセスを並行して処理するのがマルチプロセス
というのは、イメージとしては間違ってないでしょう。

結論から言えば、間違っています。
ただ、そのとらえ方は、あながち的外れでもないというところでしょうか。

まず、正解からいえば、文字通り、
マルチスレッド=複数のスレッドを並行して実行すること
マルチプロセス=複数のプロセスを並行して実行すること
です。
ちなみに、コア数は関係ありません。シングルコアでも、マルチスレッドでもマルチプロセスでも可能。

ということで、では、プロセスとかスレッドとかは何? ということになりますので、これは、詳しく勉強してみるといいと思います。
...続きを読む

Qexecvpでのcdコマンドについて。

簡単んなシェルプログラミングを組んでいます。
そこである問題にぶつかっています。
********************************************
int main()
{
int argc, n = 0;
pid_t pid;
int status;
char input[MAX_LEN], *argv[MAX_ARGS];

char path[30];

while (1) {
/* プロンプトの表示 */
++n;
printf("command[%d] ", n);


fgets(input, MAX_LEN, stdin);

/*
改行を除去し、 空白,タブ区切りでコマンド列に分割、argvに単語毎に格納

(処理は略)

*/
sprintf(path,"%s",argv[0]);//PATH取得

pid = fork();
/*#### 子プロセス ####*/
if(pid == 0){
execvp(path,argv);
exit(0);
}

/*#### 親プロセス処理 ####*/
} else {
wait(&status);
}

}//while
}//main


としています。
ここで
ls
ps
rm
mkdir
emacs
などのコマンドは普通につかえるのですが、
cd ..
や、
mkdir test
cd test
としてもそのディレクトリへ移動することができません。どうすればいいでしょうか?このプログラムをうごかしたままディレクトリを移動することは可能でしょうか?

簡単んなシェルプログラミングを組んでいます。
そこである問題にぶつかっています。
********************************************
int main()
{
int argc, n = 0;
pid_t pid;
int status;
char input[MAX_LEN], *argv[MAX_ARGS];

char path[30];

while (1) {
/* プロンプトの表示 */
++n;
printf("command[%d] ", n);


fgets(input, MAX_LEN, stdin);

/*
改行を除去し、 空白,タブ区切りでコマンド列に分割、argvに単語毎に格納

(処理...続きを読む

Aベストアンサー

おおよそ、他の方が書かれてますが、カレントディレクトリはプロセス固有の値で親から子へは継承されますが、子プロセス内で変更しても親へは伝わりません。

対応としては、コマンドがcdであることをチェックして、その場合は、fork&exec でなく、自分のプロセス内でchdirというシステムコールでカレントディレクトリを変更します。
環境変数PWDの話が出ていますが、カレントディレクトリと環境変数PWDには直接の関係がありません。PWDも変更したいならさらにsetenvサブルーチンで変更します。

話は変わって、
>execvp(path,argv);
>exit(0);
となっていますが、execvpの次の文が実行されるのはexecvpが失敗した時(pathで指定したファイルが無い等)なので、エラーメッセージを出したほうが良いでしょう。最初にそうしていれば、cd を入力するとエラーになる(cdはシェル組み込みコマンドで、cdというファイルは無いため)ので気づいたかも。

つまり、実は cd test と入れたときには子プロセスでtestにカレントディレクトリが移って親に反映しなかったわけではなく、execvpが失敗してexit(0)で子プロセスが終了していたと思われます。いずれにせよ対応は上に書いた通りでOKです。

シェルには多くの組み込みコマンドがあるので、それらのどこまで組み込むかが考えどころですね。cd のように組み込み処理が必須のコマンドもあれば、echo や test のようにコマンドファイルとしても存在するのに速度向上のために組み込みコマンドになっているものと二通りあります。

おおよそ、他の方が書かれてますが、カレントディレクトリはプロセス固有の値で親から子へは継承されますが、子プロセス内で変更しても親へは伝わりません。

対応としては、コマンドがcdであることをチェックして、その場合は、fork&exec でなく、自分のプロセス内でchdirというシステムコールでカレントディレクトリを変更します。
環境変数PWDの話が出ていますが、カレントディレクトリと環境変数PWDには直接の関係がありません。PWDも変更したいならさらにsetenvサブルーチンで変更します。

話は変わっ...続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qコマンド(例えばls)の出力結果を文字列で取得するプログラムの作成方法

はじめまして。

Linux(ディストリビューションは問わず)で
コマンド(例えばlsコマンド)を実行して
その出力結果を文字列で取得するプログラムを作成したいです。

コマンドの実行はsystem()で可能なのかな?と思っていますが、
コンソールに出力される内容はどのように取得して良いのか分かりません。

詳しい方がおりましたらご教授お願い致します。

Aベストアンサー

popen/pclose を使います。
---
char buff[1024];
FILE *fp = popen("ls", "r");
while (fgets(buff, sizeof(buff), fp)) {
printf("fgets: %s", str);
}
pclose(fp);
---
こんな感じ。

popen は、入力と出力のどちらか一方しか制御できませんので、入出力の両方を処理したい場合は、
・まじめにやる場合: 入力用・出力用、2本 pipe をつくり、それを標準入出力に dup してからfork&exec
・手をぬく場合: どちらかはANo.1のようなリダイレクトで処理。
という処理をすることになります。

QC言語で文字列をかえす正しい書き方が知りたいです?

C言語で次の警告が表示されます。
文字列を返したいのですが、正しい書き方はどのようにすれば良いのでしょうか?


jci.h(20) : warning C4172; ローカル変数またはテンポラリのアドレスを返します。


char *test(char *a, int b)
{
char str[BUFSIZ];
return str; <------

}

Aベストアンサー

再入可能にするかどうかで、回答は変わります。

A.2度呼び出した場合に前のデータを破壊してもよいケース(再入不可能)

char *test(...)
{
static char str[BUFSIZ]; // static指定でメモリは静的に確保されます。

...

return str;
}

B.2度呼び出した場合に前のデータを破壊しないケース(再入可能)
B-1.mallocを使ってもいいケース
char *test(...)
{
char *str;
str = malloc(BUFSIZ);
if(str == NULL) return NULL; // エラー

...

return str;
}
この場合は、呼び出し元でちゃんとfreeしましょう。

B-2.呼び出し元でメモリを確保するケース
(注意:同じアドレスを指定して複数回呼び出すと、メモリ内容は当然破壊されます)
char *test(char *str, ...)
{

...

return str;
}
これは#1の方の回答と同じです。

B-3.B-1/B-2の複合
(注意:NULL以外の同じアドレスを指定して複数回呼び出すと、メモリ内容は当然破壊されます)
char *test(char *str, ...)
{
if(str == NULL)
{
str = malloc(BUFSIZ);
if(str == NULL) return NULL; //エラー
}

...

return str;
}

こんなところですかね。

再入可能にするかどうかで、回答は変わります。

A.2度呼び出した場合に前のデータを破壊してもよいケース(再入不可能)

char *test(...)
{
static char str[BUFSIZ]; // static指定でメモリは静的に確保されます。

...

return str;
}

B.2度呼び出した場合に前のデータを破壊しないケース(再入可能)
B-1.mallocを使ってもいいケース
char *test(...)
{
char *str;
str = malloc(BUFSIZ);
if(str == NULL) return NULL; // エラー

...

return str;
}
この場合は、呼び...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング