共有メモリを使用する 3 つのプロセス A、B、C を作成する必要があります。A と B は共有メモリに 100 個の整数を書き込み、C はそれらを読み取り、バイナリ ファイルに書き込みます。それは私が作ったものですが、うまく動作しません。<stdio.h>
、<math.h>
、<fcntl.h>
およびが含まれ<time.h>
ます。それを機能させる方法は?
struct sync
{
int n;
int lock;
int generated;
char process;
} *b;
int testandset(int* lockPtr)
{
int oldValue = *lockPtr;
return 0 != oldValue;
}
int main()
{
struct sync buff;
int pid, ppid, fp, i;
srand(time(NULL));
b = (struct sync*)malloc(666);
b->n = 0;
b->lock = 0;
b->generated = 0;
i = 0;
printf("Generating numbers\n");
pid = fork();
if (0 == pid)
{
while (100 >= b->generated)
{
while (testandset(&(b->lock)))
{
}
buff.n = rand() % 1001;
buff.process = 'A';
fp = open("db", O_RDWR | O_APPEND);
if (-1 == fp)
fp = open("db", O_CREAT);
write(fp, &buff, sizeof(struct sync));
close(fp);
b->generated++;
b->lock = 0;
}
}
if (0 < pid)
{
ppid = fork();
if (0 == ppid)
{
while (100 >= b->generated)
{
while (testandset(&(b->lock)))
{
}
buff.n = rand() % 1001;
buff.process = 'B';
printf("No: %d %d \n", ++i, buff.n);
fp = open( "db", O_RDWR | O_APPEND );
if (-1 == fp)
fp = open("db", O_CREAT);
write(fp, &buff, sizeof(struct sync));
close(fp);
b->generated++;
b->lock = 0;
}
}
if (0 < ppid)
{
wait();
i = 0;
fp = open("db", O_RDONLY, 0755);
printf("Reading from file\n");
while (read(fp, &buff, sizeof(struct sync)))
{
if ('A' == buff.process)
i++;
}
close(fp);
int vals[i];
i = 0;
fp = open("db", O_RDONLY, 0666);
while (read(fp, &buff, sizeof(struct sync)))
{
if ('A' == buff.process)
vals[i++] = buff.n;
}
close(fp);
fp = open("db", O_RDONLY, 0455);
int i;
for(i = 0; i < i; i++)
write((const void*) &vals[i],sizeof(int),1,fp);
}
wait();
}
return 0;
}