linux之C编程学习——进程,进程,进程!

  linux支持多个进程同时进行,也就是我们常说的现代操作系统中的多道程序设计,所谓同时是linux系统调度各个进程分别占用cpu的时间。由于每个时间片的时间很小和宏观时间相比,给人的感觉是多个进程在运行。为了提高程序的运行效率,程序往往分成多个部分组成,这也就是说的并发程序设计。并发程序中各进程是相互独立的,在必要的时候会通过相应的机制进行通信。若进程间要共享资源,为了避免出现冲突,常通过相应通信机制使它们轮流使用共享资源。在进程进行通信时,会出现一个进程等另一个进程完,才能继续运行的情况,这也需要进程间通信以了解对方的运行情况。有时进程间会出现互斥现象,这是会用到锁机制。在并发程序设计中,进程的创建和结束是由用户决定的。这也就出现了父进程和子进程概念。

进程的创建:

1 #include <unistd.h>
2
3 pid_t fork(void);
4 pid_t vfork(void); 

  在这简述,fork创建的子进程是父进程的一个拷贝,但是和父进程使用不同的数据段和堆栈。vfork和fork基本相同但是vfork不会复制父进程的数据段,它们共享数据段。这是因为vfork常和exec函数使用去调用一个程序如ls命令,开启一个新的进程。vfork后父进程会等待子进程运行结束或调用了exit。fork后父进程和子进程的运行顺序是不确定的。

下面是体现它们性质的程序:

 1 #include <sys/types.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <unistd.h>
 5
 6 main()
 7 {
 8      pid_tpid;
 9      char*pchar = "before fork";
10      inttest_va = 1;
11
12      if((pid= fork()) < 0 )
13      {
14          printf("forkerror!!\n");
15          exit(1);
16      }
17
18      elseif(pid == 0)
19      {
20          printf("childprocess\n");
21          pchar= "child pchr\n";
22          printf("%s\n",pchar);
23
24          test_va= 2;
25
26          printf("%d\n",test_va);
27          _exit(2);
28      }
29
30      else
31      {
32          printf("parentprocess\n");
33          printf("%s\n",pchar);
34          printf("%d\n",test_va);
35      }
36 } 

fork:

vfork:

时间: 2025-01-11 15:54:24

linux之C编程学习——进程,进程,进程!的相关文章

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

Linux内核源码学习之僵尸进程

孤儿进程和僵尸进程 正常的子进程fork其父进程后,二者建立父子关系. 当子进程终结时,它会通知父进程,并清空自己所占据的内存,并在kernel里留下自己的退出信息(exit code,如果顺利运行,为0:如果有错误或异常状况,为>0的整数).在这个信息里,会解释该进程为什么退出.父进程在得知子进程终结时,有责任对该子进程使用wait系统调用.这个wait函数能从kernel中取出子进程的退出信息,并清空该信息在kernel中所占据的空间.这是正常的一般情况. 如果父进程早于子进程终结,子进程就

linux下Shell编程--标准的守护进程的启动脚本

一个标准的守护进程的启动脚本: #! /bin/sh WHOAMI=`whoami` PID=`ps -u $WHOAMI | gerp mydaemond | awk '{print $1}'` if (test "$1" = "") then echo "mydaemond [start][stop][version]" exit 0 fi if ( test "$1" = "status") then

linux下网络编程学习——入门实例ZZ

http://www.cppblog.com/cuijixin/archive/2008/03/14/44480.html 是不是还对用c怎么实现网络编程感到神秘莫测阿,我们这里就要撕开它神秘的面纱,呵呵. 一起来: 诶,不要着急,我们先来介绍一些网络程序的主要执行过程,主要是便于大家更好的理解下面的程序实例哦 : 1)系统启动服务器执行.服务器完成一些初始化操作,然后进入睡眠状态,等待客户机请求.2)在网络的某台机器上,用户执行客户机程序3)客户机进行与服务器进程建立一条连接4)连接建立后,客

linux之C编程学习——信号处理

信号处理是linux程序的一个特色.用信号处理来模拟操作系统的中断功能.要想使用信号处理功能,你要做的就是填写一个信号处理函数即可. 1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <stdlib.h> 4 #include <signal.h> 5 6 int flag = 1; 7 8 void func(int sig) 9 { 10 printf("I get a signa

Unix/Linux shell脚本编程学习--Shell Script II

Shell Script II 10.Shell echo命令 echo "OK!\n”   #显示换行 echo "It is a test" echo无拼接字符时后一般可以不使用”引号”,从上面可看出,双引号可有可无,单引号主要用在原样输出中. 显示结果重定向保存至文件: vim myfile 创建文件 echo "It is a test" > myfile cat myfile 查看文件内容 若需要原样输出字符串(不进行转义),请使用单引号.

linux下网络编程学习——入门实例

http://www.cppblog.com/cuijixin/archive/2008/03/14/44480.html 是不是还对用c怎么实现网络编程感到神秘莫测阿,我们这里就要撕开它神秘的面纱,呵呵. 一起来: 诶,不要着急,我们先来介绍一些网络程序的主要执行过程,主要是便于大家更好的理解下面的程序实例哦 : 1)系统启动服务器执行.服务器完成一些初始化操作,然后进入睡眠状态,等待客户机请求.2)在网络的某台机器上,用户执行客户机程序3)客户机进行与服务器进程建立一条连接4)连接建立后,客

Linux下网络编程学习杂记

1.TCP/IP协议的体系结构包含四层:应用层(负责应用程序的网络服务,通过端口号识别各个不同的进程)->传输层(传输控制层协议TCP.用户数据报协议UDP.互联网控制消息协议ICMP)->网络层->网络接口层(负责将二进制流转换成数据帧,并进行数据帧的发送和接收)->硬件层. 2.服务器是指能在网络上提供服务的任何程序:客户机是指用户为了得到某种服务所需运行的应用程序. 3.网络通信即为进程间的通信,套接口就是网络进程的ID.使用端口号和网络地址的组合能够唯一确定整个网路中的一个

linux之C编程学习——EOF

EOF是 End Of File 的缩写.在C语言中,它是在标准库中定义的一个宏.多数人认为文件中有一个EOF,用于表示文件的结尾.但这个观点实际上是错误的,在文件所包含的数据中,并没有什么文件结束符.对getc 而言,如果不能从文件中读取,则返回一个整数-1,这就是所谓的EOF.返回 EOF 无非是出现了两种情况,一是文件已经读完;:二是文件读取出错,反正是读不下去了.文件结束符EOF,Windows下为组合键Ctrl+Z,Unix/Linux下为组合键Ctrl+D,在linux中ctrl+c