源代码放到了三个文件中:

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

includeall.h

#include "includeall.h"
int my_sum(int a,int b)//calculate the sum from a to b
{
int sum=;
int i;
for(i=a;i<=b;++i)
{
sum+=i;
}
return sum;
}

function.c

 #include "includeall.h"
int my_sum(int,int);
int a,b,c;
int main()//calculate the sum from 1 to 100
{
int pid1,pid2;
int * pointa=&a;
int * pointb=&b;
pid1=fork();
if(pid1==)
{
*pointa=my_sum(,);
printf("pointa: %p\n",pointa);
printf("*pointa: %d\n",*pointa);
printf("pointb: %p\n",pointb);
printf("*pointb: %d\n",*pointb);
//return (a);
}
else{
pid2=fork();
if(pid2==)
{
*pointb=my_sum(,);
printf("pointa: %p\n",pointa);
printf("*pointa: %d\n",*pointa);
printf("pointb: %p\n",pointb);
printf("*pointb: %d\n",*pointb);
//return (b);
}
else{
wait();
wait();
c=(*pointa)+(*pointb);
printf("finished\n");
printf("sum (from 1 to 100): %d\n",c);
}
}
return ;
}

main.c

程序一运行的时候一共有三个进程,两个子进程分别负责计算1~50的和 和51~100 的和,父进程负责统计这两个子进程的计算结果。

由于对进程间的通信不熟练,于是想到了使用指针的方式。实际运行的时候两个指针变量在三个进程间的值确实是一样的(正如期望的那样),但是在一个进程中通过间接访问的方式对指针指向的内存单元的值进行修改后,在其它进程中使用间接访问的方式取得的值却并不是修改后的(它们的执行顺序没错,是先修改后读取的)。怪哉!

猜测可能是操作系统对进程进行隔离造成的,即我们打印出来的内存的地址相同,但不意味着实际对应的内存单元就相同。

内功不足,只是猜测

由linux下的多进程编程引发的关于进程间隔离的思考的更多相关文章

  1. Linux下的多进程编程

    1.进程 1.1进程的定义 <计算机操作系统>这门课对进程有这样的描述:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统 ...

  2. Linux下的C编程实战

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来, Linu ...

  3. Linux下TCP网络编程与基于Windows下C#socket编程间通信

    一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...

  4. Linux下C语言编程实现spwd函数

    Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...

  5. linux下的c编程

    linux下的c编程 Linux 系统上可用的 C 编译器是 GNU C 编译器, 它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布.GNU  C 对标准 C 进行一系列扩展,以增强标准 ...

  6. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  7. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

  8. LINUX下C语言编程调用函数、链接头文件以及库文件

    LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时, ...

  9. Linux下C语言编程基础学习记录

    VIM的基本使用  LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s ...

随机推荐

  1. 网页中的超链接<a>标签

    格式: <a href="目标网址" title="鼠标滑过显示的文本">链接显示的文本</a> 注意:为文本加入<a>标签 ...

  2. LightOj1203 - Guarding Bananas(凸包求多边形中的最小角)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1203 题意:给你一个点集,求凸包中最小的角:模板题,但是刚开始的时候模板带错了,错的我 ...

  3. C# HttpWebRequest 绝技

    http://www.sufeinet.com/thread-6-1-1.html 万能框架.分布式......

  4. git 项目初始化

    1.在git服务器界面右上角“+” .create  new  project ,写上项目名字生成一个新的组 2.如果机器第一次与git 建立连接,需要让机器生成一个id_rsa和id_rsa.pub ...

  5. Using dbms_shared_pool.purge to remove a single task from the library cache

    我们都知道可是使用 alter system flush shared_pool 来清除shared pool 信息,当时不能指定清除某个对象.因为在系统繁忙的时侯 使用 alter system f ...

  6. [BS-10] 统一设置app所有页面的“返回”按钮样式

    统一设置app所有页面的“返回”按钮样式 如果想统一设置app所有页面的“返回”按钮样式,首先自定义WZNavigationController类继承UINavigationController类,然 ...

  7. gcc常用

    gcc选项:-I指定头文件搜索路径.-D编译时定义宏-L链接时指定库文件搜索路径-l指定库文件名称-pipe使用管道,一个程序的输出作为输入直接送给另外一个程序, 而且还可以一直连续下去,不需要临时文 ...

  8. python_类

    1. 对象的概念 对象包括特性和方法.特性只是作为对象的一部分的变量,方法则是存储在对象内的函数.对象中的方法和其他函数的区别在于方法总是将对象作为自己的第一个参数,这个参数一般称为self. 2. ...

  9. msvc库没有安装包,编译选项选择 代码生成 MT【多线程】,C#调用

    参考提过的一个问题,封装VC++动态链接库,C#调用,并将C#程序打包为exe安装包. 感谢大神.

  10. [phonegap]安装phonegap

    下载nodejs,安装,单nodejs4.0.0 x64编译时,还需要python2.6 or python2.7: 参考怎么安装python2.7:            http://jingya ...