0

親プロセスと子プロセスを同期させて、1 から 10 までを交互にファイルに出力したいと考えています。そして、どのプロセスが番号を出力したかを出力します。次のコードは代わりに出力しますが、同じ番号です。私を助けてください!

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

#define MSGSIZE 16
int parent= 1;
int n=-1;
main ()
{
  int i;
  char *msg = "How are you?";
  char inbuff[MSGSIZE];
  int p=0;
  FILE *fp1,*fp2;
  pid_t ret;

  ret = fork ();
  if (ret > 0)
    {
      i = 0;
      while (i < 10)
    {

      n++;
     // sprintf(msg, "%d", n);
     // fp=fopen("abc.txt","a");
     // write (p[1], itoa(n,msg,MSGSIZE), MSGSIZE);
     // sleep (2);
    // fclose(fp);
      //read (p[0], inbuff, MSGSIZE);

    fp1=fopen("abc.txt","r");
    fscanf(fp1,"%d",&n);
    fclose(fp1);
    fp1=fopen("abc.txt","w");
     fprintf(fp1,"%d",n); 
    printf("Parent: %d\n", n);
      i++;
    fclose(fp1);
    sleep(2);

    }
    exit(1);
    }
  else
    {
      i = 0;
      while (i < 10)
    {

      n++;
      //sleep (1);
     // read (p[0], inbuff, MSGSIZE);

     fp2=fopen("abc.txt","r");
     fscanf(fp2,"%d",&n);
     fclose(fp2);
     fp2=fopen("abc.txt","w");

     fprintf(fp2,"%d",n);        
      printf("Child: %d\n", n);
           i++;

     sleep(2);

    }
    }
  exit (0);
}
4

2 に答える 2

1

これは、プロセスがメモリを共有しないためです。したがって、基本的にnプロセスごとに異なります。inter-process-communicationこれには、Linux がそれを行うためのいくつかの方法を提供する を使用する必要があります。

http://tldp.org/LDP/lpg/node7.html

n一般に、親プロセスと子プロセスの間で値を共有する方法を見つける必要があるだけです。

注: ユーザー スレッドでは、同じプロセスのユーザー スレッドがメモリを共有するため、この問題は発生しません。アクセスを同期するだけです。また、プロセスで使用する方法によっては、アクセスを同期する必要がある場合もあるので注意してください。

于 2012-05-15T07:23:26.363 に答える
0

変数の同じメモリ位置を変更しようと考えている場合、両方のプロセスのアドレス空間が異なるため、それは不可能です。スレッドの場合でも同じことが達成できます。

于 2012-05-15T07:29:49.297 に答える