我必须创建三个使用共享内存的进程 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;
}
最佳答案
文件对于多进程共享信息(并同时编辑)来说并不可靠,您宁愿在事务模式下使用真实数据库或使用 IPC http://www.cs.cf.ac.uk/Dave/C/node27.html .或者重新设计并使用线程和互斥锁。
关于c++ - C/C++中如何让三个进程工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16635998/