0

私はc言語とLinuxが初めてです。fork()、getpid()、および exec() 関数に関連する問題があります。fork() 呼び出しを使用して ac プログラムを作成しました。私のプログラムのコードは次のコードです。

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

void fun()
{
  printf("\n this is trial for child process");
}

int main (int argc, char const *argv[])
{
  int i,status,pid,t;

  if(pid=fork()<0)
  { 
    printf("\nfailed to create the process\n");
  }
  if(pid=fork()==0)
  {
    printf("\n the child process is created");
    fun();
    exit(1);
  }
  while(wait(&status)!=pid);
  return 0;
}

このプログラムの出力は次のとおりです。

子プロセスが作成されます

これは子プロセスの試行です

子プロセスが作成されます

これは子プロセスの試行です

今、私の質問は次のとおりです。

  1. プログラムの出力が同じことを 2 回表示するのはなぜですか? 「子プロセスが作成されました。これは子プロセスの試行です」となるはずの出力
  2. 出力がコードに従っていないのはなぜですか?
  3. 4 つのプロセスがあり、すべてのプロセスが異なるタスクを実行するプログラムを作成できますか。たとえば、1 つのプロセスが「私の名前」を出力します。1 つのプロセスは "my age" を出力し、もう 1 つのプロセスは "my address ?
  4. メイン関数で複数のプロセスを作成する方法は?
  5. 複数のプロセスの実行を制御するには?
  6. 関数は何をしexec()ますか?exec()の動作をソースコードfork()で説明してもらえますか?getpid()

この初心者を助けてください。

4

3 に答える 3

1

あなたのコードはfork()複数回呼び出します:

if(pid=fork()<0) /* calls fork() */
{ 
   ...
}
if(pid=fork()==0) /* also calls fork() */
{
   ...
}

成功するたびにfork()、新しい子プロセスが作成されます。さらに悪いことに、2 番目fork()は親と最初の子の両方から呼び出されます。

単一の子プロセスを作成しようとしている場合は、一fork()度だけ呼び出す必要があります。

pid_t pid; /* note the correct return type of fork() */
...
pid = fork();
if (pid < 0)
{ 
   ...
}
else if (pid == 0)
{ 
   ...
}

複数の子プロセスを作成する場合は、親プロセスをfork()ループで呼び出すことができます。

「何をするの?」のような質問に関してexecは、使い方を学んでからman、マンページに不明な点がある場合は具体的な質問に戻ることをお勧めします。

于 2011-06-01T09:56:57.787 に答える
0

このコードでは、メイン プロセスを含まない 3 つのプロセスを作成しています。

pid=fork()

それ自体が statement であり、 if ステートメント条件内にある場合でも、新しいプロセスをフォークします。最初の fork() 呼び出しの後、残りのコードが 2 回実行されます。したがって、次の fork 呼び出しは 2 回呼び出されます。新しいプロセスはすでに作成されています。

fork はそれ自体にゼロを返し、そのプロセス ID を親に返します

つまり、プロセスAがBをフォークすると考えられます(コードからではありません)

 pid = fork();
 printf("pid is : %d",pid);

printf ステートメントは 2 回実行されます (A 用に 1 回、B 用に 1 回)。Aの場合、出力します(Aは親です)

pid is : 512 //何らかの整数値のプロセス ID

とBプリント

ピッドは: 0

だからあなたの質問で

 if(pid=fork()==0)
  {
    printf("\n the child process is created");
    fun();
    exit(1);
  }

これは、すでに 2 回実行されている 2 番目のフォークです。したがって、この実行のたびに、新しい子プロセスが作成されます。両方の子の pid 値は 0 です。したがって、print ステートメントが実行され、出力に表示されます。しかし、両方の親に対して pid 値があり、if 条件が失敗するため、印刷されません。これらの 2 つの子は、2 番目と 3 番目のプロセスです。要するに、メイン プロセスとともに 3 つのプロセスを作成します。

于 2011-06-01T09:59:52.373 に答える
0

2 回フォークしているため、出力は 2 回生成されます。

if(pid=fork()<0)  // Fork #1
{ 
   printf("\nfailed to create the process\n");
}
if(pid=fork()==0) // Fork #2
于 2011-06-01T09:58:55.603 に答える