我正在尝试打印子进程所恭维的单词并将其添加起来。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
count_t word_count(char *file)
{
-counts the words from a file---
}
int main(int argc, char **argv)
{
int i,j, numFiles,pid_count[10],pid;
int global;
numFiles = atoi(argv[1]);
printf("counting %d files..\n", numFiles);
j=0;
for(i = 0; i < numFiles; i++)
{
pid_count[i] = fork();
if(pid_count[i] < 0) {
printf("Error creating the child process\n");
} else if (pid_count[i] == 0) {
char filename[100];
sprintf(filename, "%s/text.%02d", FILEPATH, i);
printf("read: %s\n", filename);
int local;
printf("Child PID: %d Handling File No : %d\n",getpid(), i);
local = word_count(filename);
global += local;
exit(0);
} else {
continue;
}
}
int wstatus;
for(i = 0; i < numFiles; i++)
{
waitpid(pid_count[i], &wstatus, 0);
}
printf("total word count is %d",global);
return(0);
}
但是在输出中,全局变量只打印0,而每个局部变量都有精确的计数,它只是不加起来全局
答案 0 :(得分:5)
进程只是不这样做。每个子进程都获取父进程的内存副本,但它只是:副本。对子进程所做的更改对于父进程是不可见的,即它们不共享内存。
如果要与子项共享内存,可以考虑使用线程而不是进程。或者如果您愿意,可以使用共享内存(有几种方法可以在进程之间共享内存)。但无论如何,你需要一些同步原语,你不希望所有的线程/进程同时进入同一个内存位置......
另一种不同的选择是根本不共享内存,而是每个子进程可以通过一些进程间通信(管道或其他东西)将结果值发送给父进程,并且父进程将添加它们。
答案 1 :(得分:1)
子进程是一个不同的进程。它运行与父进程相同的代码,但它拥有自己父进程的数据段的副本。
每个子流程都会修改自己的local
和global
变量副本。它们与父进程中定义的global
变量不同(因为它们位于不同的进程中,并且它们之间没有共享内存。)
有几种方法可以让孩子将send data处理到父进程。我认为最简单的方法是使用管道。阅读this tutorial。它包含一个小程序,可以帮助您理解这个概念。