问题描述
在以下代码中,父进程和子进程在修改count之后,count始终为0。
#include "stdio.h"
#include "unistd.h"
#define MAXSIZE 100
int in = 0;
int out = 0;
int count=0;
int child_process_id = 0;
char buffer[MAXSIZE];
void producer();
void comsumer();
void main() {
__pid_t pid = fork();
printf("The process id = %d\n", pid);
if(pid == -1) {
perror("fork error!");
} else if(pid == 0){
printf("Hello from child process: %d\n", getpid());
child_process_id = getpid();
comsumer();
} else {
printf("Hello from father process: %d\n", getpid());
//__pid_t pid1 = fork();
producer();
}
}
void producer() {
while (1)
{
while (count == MAXSIZE){
printf("producer:%d, %d\n", count, getpid());
scanf("%d", count);
}
in = (in+1)%MAXSIZE;
count++;
}
}
void comsumer() {
while (1)
{
while (count == 0){
printf("comsumer:%d, %d\n", count, getpid());
scanf("%d", count);
}
out = (out+1)%MAXSIZE;
count--;
}
printf("Comsumer exit!\n");
}
问题分析
count会被子进程赋值过去,所以fork之后,父进程和子进程都有自己的count.无法修改count,所以count始终为0.
解决方法
count改为*count,这时fork之后,子进程复制的是地址。但是修改的时候修改*count的内容就好,count内存地址保持和父进程一样就可以。
问题:运行的时候发现count打印结果还是0.
原因:由于count=10,在comsumer进程中很快就消耗到0,所以无法被producer进程感知到count发生变化,其实comsumer已经从10变为0.
解决方法:通过scanf中断的形式,认为地修改count为10,此时comsumer进程无法在100以内时间完成到0地任务,这时producer恰好感知到了count变化,于是就进入了producer的减1操作。