c++ - C/C++中如何让三个进程工作

标签 c++ c memory process shared

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

相关文章:

java - Tomcat内存消耗问题

c++ - 替换 QVariant::Handler::canConvert

c++ - 如何检测 double 浮点上溢和下溢?

c - pthread_cond_broadcast 不向线程发送信号

c - 汇编语言中的斐波那契数列

java - 将一个对象的值分配给另一个对象 - 它们不能在内存中指向相同的地址

c++ - 错误 : '_mm512_loadu_epi64' was not declared in this scope

c++ - 重载全局类型转换运算符

确认数组的缓存对齐

react-native - 如何处理内存中的 React Native 敏感字符串信息