1、进程的创建

编写一段程序,使用系统调用fork( )创建两个子进程,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b” 和“c”。试观察记录屏幕上的显示结果,并分析原因。

  # include<stdio.h>

     main()

     { int  p1, p2;

     while((p1=fork())= = -);

     if(p1= =)

     putchar(‘b’);

     else

       { while((p2=fork())= =-);

         if(p2= =)

         putchar(‘c’);

         else

         putchar( ‘a’);

        }

      } 

2、 修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行时屏幕上出现的现象,并分析其原因。

 # include<stdio.h>
main()
{ int p1, p2, i;
while((p1=fork())= = -);
if(p1= =)
for(i=;i<;i++)
printf(“child%d\n”,i);
else
{ while((p2=fork())= =-);
If(p2= =)
for(i=;i<;i++)
printf(“son%d\n”,i);
else
for(i=;i<;i++)
printf(“daughter%d\n”,i);
}
}

3、编写程序创建进程树如图1和图2所示,在每个进程中显示当前进程识别码和父进程识别码。

图一

#include<stdio.h>
//#include<sys/types.h> /* 提供类型pid_t的定义 */
#include<unistd.h> /* 提供函数的定义 */
int main()
{
int p1,p2,p3;
while((p1=fork())== -);
if(p1==)
{
while((p2=fork())==-);
if(p2==)
{
while((p3=fork())==-);
if(p3==)
{
// putchar('d');
printf("I am D,My pid is %d, my parent's pid is %d\n", getpid(), getppid());
}
else
{
// putchar('c');
printf("I am C,My pid is %d, my parent's pid is %d\n", getpid(), getppid());
}
}
else
{
// putchar('b');
printf("I am B,My pid is %d, my parent's pid is %d\n", getpid(), getppid());
}
}
else
{
//putchar('a');
printf("I am A,My pid is %d\n", getpid());
}
printf("\n");
getchar();
}

图二

#include<stdio.h>
#include<sys/types.h> /* 提供类型pid_t的定义 */ #include<unistd.h> /* 提供函数的定义 */
int main()
{
int p1_B,p1_C,p2_D,p2_E;
while((p1_B=fork())== -);
if(p1_B==)
{
printf("I am B,My pid is %d, my parent's pid is %d\n", getpid(), getppid());
while((p1_C=fork())== -);
if(p1_C==)
printf("I am C,My pid is %d, my parent's pid is %d\n", getpid(), getppid());
}
else
{
printf("I am A,My pid is %d\n",getpid());
while((p2_D=fork())==-);
if(p2_D==)
{
printf("I am D,My pid is %d, my parent's pid is %d\n", getpid(), getppid());
while((p2_E=fork())== -);
if(p2_E==)
printf("I am E,My pid is %d, my parent's pid is %d\n", getpid(), getppid());
}
}
getchar();
}

进程控制编程——Linux编程的更多相关文章

  1. Linux&c 文件操作,线程进程控制,网络编程,简单知识点梳理

    一:文件操作 在linux下,一切皆文件,目录是文件,称为目录文件,内容是该目录的目录项(但是目录只有内核可以编辑,超级用户也不可以编辑),设备也是设备文件,在/dev存放的就是一些设备文件,linu ...

  2. Linux&c 文件操作,线程进程控制,网络编程,简单知识点梳理

    一:文件操作 在linux下,一切皆文件,目录是文件,称为目录文件,内容是该目录的目录项(但是目录只有内核可以编辑,超级用户也不可以编辑),设备也是设备文件,在/dev存放的就是一些设备文件,linu ...

  3. 【目录】linux 编程

    随笔分类 - linux 编程 Linux编程 24 shell编程(结构化 if [ condition ] 数值比较,字符串比较) 摘要: 一.概述 接着上篇讲的结构化命令,最后讲到了test命令 ...

  4. 【linux草鞋应用编程系列】_2_ 环境变量和进程控制

    一. 环境变量     应用程序在执行的时候,可能需要获取系统的环境变量,从而执行一些相应的操作.     在linux中有两种方法获取环境变量,分述如下.   1.通过main函数的参数获取环境变量 ...

  5. Linux系统编程:进程控制

    一.进程相关操作与编程对应函数 1.进程创建:两种方式来实现. ①fork:创建一个子进程,父子进程共享一份代码程序,但是各有一份独立的数据,为了效率和保持数据的独立采用写时复制技术(COW).运行无 ...

  6. Linux网络编程学习(三) ----- 进程控制实例(第三章)

    本节主要介绍一个进程控制的实例,功能就是在前台或者后台接收命令并执行命令,还能处理由若干个命令组成的命令行,该程序命名为samllsh. 基本逻辑就是 while(EOF not typed) { 从 ...

  7. Linux网络编程学习(二) ----- 进程控制(第三章)

    1.进程和程序 程序是一个可执行文件,而一个进程是一个执行中的程序实例.一个进程对应于一个程序的执行,进程是动态的,程序是静态的,多个进程可以并发执行同一个程序.比如几个用户可以同时运行一个编辑程序, ...

  8. Linux系统编程之进程控制(进程创建、终止、等待及替换)

    进程创建 在上一节讲解进程概念时,我们提到fork函数是从已经存在的进程中创建一个新进程.那么,系统是如何创建一个新进程的呢?这就需要我们更深入的剖析fork函数. 1.1 fork函数的返回值 调用 ...

  9. (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

随机推荐

  1. Java设计模式学习记录-简单工厂模式、工厂方法模式

    前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...

  2. 【Leetcode】338. Bit位计数

    每次刷leetcode都有一种发现新大陆的感觉. 题目链接:https://leetcode-cn.com/problems/counting-bits/description/ 给定一个非负整数 n ...

  3. 并发编程—— FutureTask 源码分析

    1. 前言 当我们在 Java 中使用异步编程的时候,大部分时候,我们都会使用 Future,并且使用线程池的 submit 方法提交一个 Callable 对象.然后调用 Future 的 get ...

  4. SQL Server “复制”表结构,创建_Log表及触发器

    实例效果: 实现表数据的增修删时,记录日志. 1.“复制”现有表, 创建相应的_Log表: (注意点: 通过select union all 的方式,避免了IDENTITY 的“复制”,即如果原表有 ...

  5. (五)JMM的介绍

    1. JMM的介绍 在上一篇文章中总结了线程的状态转换和一些基本操作,对多线程已经有一点基本的认识了,如果多线程编程只有这么简单,那我们就不必费劲周折的去学习它了.在多线程中稍微不注意就会出现线程安全 ...

  6. JAVA-将内容写入文件并导出到压缩包

    取出数据库表中的内容写入到文件,并将所有文件写入到压缩包最终导出到指定的某目录下        //导出的压缩包格式  xxxx_date        Date currentTime = new ...

  7. POJ3616(KB12-R dp)

    Milking Time Time Limit: 1000MS    Memory Limit: 65536K Total Submissions: 9459  Accepted: 3935   De ...

  8. 【代码笔记】iOS-字体从右向左滚动

    一,效果图. 二,代码. ViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup ...

  9. Oracle 12c SQL Developer连接报错(ORA-12505)

    Oracle 12c SQL Developer连接报错(ORA-12505) 连接时报错码:Listener refused the connection with following error: ...

  10. CentOS6.5搭建ldap及pdc的过程

    linux   centos6.5,,配置的是本地yum,采用光盘自带的rpm包进行安装 安装openldap server 以及client yum install openldap-server ...