【问题标题】:Update global variable from function C从函数 C 更新全局变量
【发布时间】:2020-09-09 16:03:10
【问题描述】:

我正在编写一个 C 程序。我已经定义了一个全局变量,其值将从主函数更新。但问题是它没有发生。你能告诉我我做错了什么吗?这是我的代码。

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
#include<sys/wait.h>

extern int DELAY=10;
int DATA1=0;
int DATA2=0;


int main(){
    generateData(0);
    return 0;
}
void generateData(int x){
    int y=x;
    int p1,p2;
    p1=fork();
    p2=fork();
    if(p1==0 && p2>0){
        for(int i=0;i<3;i++){
            printf("p1:%d\n",i);
            sleep(1);
            if(x==0){
                x=1;
                DATA1=x;
            }
            else if(x==1){
                x=0;
                DATA1=x;
            }
            // printf("%d\n",DATA1);
            // l=DATA1;
            printf("DATA1:%d\n",DATA1);
        }
    }
    else if(p2==0 && p1>0){
        for(int i=0;i<3;i++){
            printf("p2:%d\n",i);
            sleep(10);
            if(y==0){
                y=1;
                DATA2=y;
            }
            else if(y==1){
                y=0;
                DATA2=y;
            }
            // m=DATA2;
            printf("DATA2:%d\n",DATA2);
        }
    }
    else if(p1>0 && p2>0){
        wait(0);
        printf("DATA1=%d, DATA2=%d\n",DATA1,DATA2);
        kill(p1,SIGKILL);
        kill(p2,SIGKILL);
        checkTruthTable(DATA1,DATA2);
    } 
}

int checkTruthTable(int x, int y){
    return 0;
}

我想从 generateData 函数更新 DATA1 和 DATA2 的值。当我尝试为第三个 else if 循环打印数据时,它显示我 DATA1=0, DATA2=0

结果:

p2:0
p1:0
DATA1:1
p1:1
DATA1:0
p1:2
DATA1:1
DATA1=0, DATA2=0

【问题讨论】:

  • 我已经尝试过了,但我无法调试我做错了什么
  • 是的,它正在进入那个循环,这就是为什么它同时打印数据值 Data1 和 Data2 一起打印,这在那个循环中@MohitReddy
  • 我的错,是的,父母的第二个孩子将进入第二个街区。我不知道函数generateData() 的逻辑是什么,但是父级执行最后一个 elseif() 块并且您没有在那里更新任何变量。即使孩子更新它也不会反映在父母的记忆中,因为孩子有单独的堆、堆栈、数据部分......等等。参考fork()手册页你会更好地理解。
  • 您的意图似乎是并行计算 DATA1 和 DATA2 值。尽管您成功地计算了它们,但您无法将它们存储在父母的记忆中。您需要采用一些 IPC 方法来做到这一点。最好和最简单的是管道。

标签: c


【解决方案1】:

虽然您成功计算了DATA1DATA2,但它们并没有在父母记忆中更新。有关更多详细信息,请参阅 fork() 手册页。您需要采用一些 IPC 方法将数据从子节点返回给父节点。下面的代码使用pipe() 来实现这一点。

#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>

int DATA1 = 0;
int DATA2 = 0;

void generateData()
{
    int fd1[2];
    pipe(fd1);

    pid_t fk1_return = fork();

    if (fk1_return == 0) {  // child 1 runs this.
        close(fd1[0]);  // Close read descriptor in child1;

        /* Compute DATA1 */
        DATA1 = 1;

        write(fd1[1], &DATA1, sizeof(int));
        close(fd1[1]);
        exit(0);
    }
    else if (fk1_return > 0) {  // parent runs this.
        int fd2[2];
        pipe(fd2);

        pid_t fk2_return = fork();

        if (fk2_return == 0) {  // child 2 runs this
            close(fd2[0]); // Close read descriptor in child 2;

            /* Compute DATA2 */
            DATA2 = 2;

            write(fd2[1], &DATA2, sizeof(int));
            close(fd2[1]);
            exit(0);
        }
        else if (fk2_return > 0) {  // parent runs this
            close(fd1[1]); // close write descriptor in parent
            close(fd2[1]); // close write descriptor in parent

            read(fd1[0],&DATA1, sizeof(int));   // Assuming partial reads wont happen
            waitpid(fk1_return, NULL, 0);   // Release child1 resources;
            close(fd1[0]);

            read(fd2[0], &DATA2, sizeof(int));
            waitpid(fk2_return, NULL, 0);   // Release child2 resources;
            close(fd2[0]);
        }
    }
}

int main() {
    generateData();
    printf("%d %d\n", DATA1, DATA2);

    return 0;
}

输出

1 2 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 2020-04-22
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多