0

我必须创建三个使用共享内存的进程 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;
}
4

2 回答 2

1

文件对于多进程共享信息(和同时编辑)并不可靠,您宁愿在事务模式下使用真实数据库或使用 IPC http://www.cs.cf.ac.uk/Dave/C/节点27.html。或者可能重新设计和使用线程和互斥锁。

于 2013-05-19T16:40:30.267 回答
1

这里有很多问题,但我会集中讨论testandset()。首先,它命名错误,它没有设置任何东西,你也没有在b->lock任何地方设置。这是为了什么?

在我看来,您可能正在尝试将它用于进程之间的某种锁定,但它不起作用。当你 fork 时,新的孩子有效地获得了父地址空间的完整副本,并且对父中变量的更改不会在子中看到,反之亦然。正如 Maresh 所说,您需要考虑使用进程间通信。

于 2013-05-19T17:07:25.230 回答