linux下多进程编程简介

原创 2004年06月25日 13:55:00

两年前的文章,拿过来充充门面。

————————————————————————

linux下多进程编程简介

( 作者:mikespook | 发布日期:2002-12-8 | 浏览次数:272 )

关键字:Linux,多进程,fork(),wait()
前言:
    本文章只是为了给广大和我一样的菜鸟一个指引。如果你是高手,或对编程毫无兴趣。建议请不要在此浪费时间。

  多进程是一个非常有用的东西。记得我上次介绍的那个TCP connect扫描器么,是不是很慢?如果你使用多进程分段扫描端口,你会发现速度大大提升。下面我们就来看看怎么在Linux下进行多进程编程。
    首先,简单介绍一下我们要用的函数:fork()、wait()。
    fork()函数是一个很有意思的函数。他可以建立一个新进程,把当前的进程分为父进程和子进程。原来进程的所有页面在调用fork()函数时被分为相同的两份,所以父进程和子进程都使用相同的映像。该函数与普通函数的不同之处是函数如果调用成功会返回两次,在父进程中返回子进程的PID;在子进程中返回0。成功后,父进程和子进程都在fork()函数后继续执行。如果函数调用不成功,则返回一次,返回值为 -1。
    由于在进程运行时,如果子进程先退出,它不会从进程列表里清除。而要发一个SIGCHLD(或SIGCLD)信号给父进程,父进程确认后子进程才会退出。在等待父进程确认期间,子进程处于“zombie”状态。所以我们就需要使用wait()函数。如果调用wait()函数时已经有一个处于“zombie”状态的子进程,那么函数立即返回的同时该子进程从内存中清除出去;否则,主进程会被挂起,直到其中一个进程退出。直接调用wait()函数有个很明显的缺点就是父进程会被挂起而无法进行其他任务。解决办法就是拦截处理信号SIGCHLD(或SIGCLD),这我会在以后讲信号处理的文章中给大家简单的说说。

老规矩,通过源代码来学习多进程编程。

/*--------------------------fork.c------------------------------*/
/* mikespook */
/* exercise function fork() and wait()*/
/* 2002.5.28 */

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#define FAC_N 65535

/* 子进程调用的函数,这里我为了模拟一个很大的后台操作用了一个循环。 */
void big_loop(int n);
/* 父进程调用的函数,其实不放到函数里也可以,不过为了程序的结构更好看还是放到函数里的好 */
void input_information();

int main()
{
  /* 进程号 */
  pid_t pid;
  /* 程序在这里“分叉”,新的进程创建了 */
  pid = fork();
  /* 通过fork()的返回值来判断是父进程还是子进程 */
  switch(pid){
    /* 返回 -1,很不幸,创建进程失败了。可能是没有足够的内存空间,也可能已经开起了太多的进程。 */
    case -1:
      perror("fork/n");
      break;
    /* 返回 0,现在是在子进程里运行,那就调用子进程的操作函数。 */
    case 0:
      /* 一个运行65535次的循环,如果你的机子太快,不能看清楚两个进程同时运行的效果,那就再加大循环次数。或用sleep()函数 */
      big_loop(FAC_N);
      /* 取得子进程的PID,你可以看清楚子进程和父进程的PID是不同的(子进程的PID比父进程的要大,因为是在父进程运行后才创建的)。*/
      printf("PID:%d/n", getpid());
      break;
    /* 哈哈,返回的即不是错误,又不是子进程,那就是父进程喽。*/
    default:
      /* 这里让用户输入了4个数 */
      input_information();
      /* 取得子进程的PID。*/
      printf("PID:%d/n", getpid());
      break;
  }
  /* 等着吧,子进程不退出,你父进程也不能退出的。 */   
  wait();
  exit(0);  
}

/*big_loop: 简单,一看就明白,不解释了。*/
void big_loop(int n)
{
  int i;
  for(i = 0; i < n; i++){
    switch(i % 4){
      case 0:
        putchar('-');
        break;
      case 1:
        putchar('/');
        break;
      case 2:
        putchar('|');
        break;
      case 3:
        putchar('//');
        break;
    }
    putchar('/b');
  }
}

/*input_information: 简单,一看就明白,也不解释了。*/
void input_information()
{
  int n_table[4], i;

  for(i = 0; i < 4; i++){
    printf("Number %d:/t", i);
    scanf("%d", &n_table[i]);
  }

   printf("Number1/tNumber2/tNumber3/tNumber4/n");
   printf("%d/t%d/t%d/t%d/n", n_table[0], n_table[1], n_table[2], n_table[3]);
}
/*--------------------------fork.c------------------------------*/

  同样,我再给大家补充几点,以供参考。
  多进程的好处是同时并行的运行多个任务。由于各自使用独立的内存空间,所以不容易由于冲突而出错。但是这样就给进程间的通信带来了一定的麻烦。当然有很多办法,比如管道,消息等等可以解决这个问题。多进程还有一个问题就是内存空间的浪费。一个进程就是一个完整的内存映像,有一些数据重复放置,这样对内存空间浪费是很严重的(我想这也就是多线程比多进程要优越的原因,可惜我还没有完全搞明白linux下的多线程,要不然也和大家讨论讨论。过段时间吧!)。还有,我要提示的是上面这个例子我在最后用了wait()函数,这样父进程运行完后回等着子进程退出才退出。你可以试试把wait();这个语句去掉,看看什么效果?父进程运行完退出了,我们回到了[mikespook @ lazycat]$的提示符下,而子进程继续在运行。有时我们可以利用这个把一个进程放到后台去运行(比如木马……当然啦,我不是建议你做木马!)。
  好啦,Linux下的多进程编程就怎么点内容,是不是很简单呢?其实,让两个进程独立运行很容易,关键的难点是父进程和子进程共享数据,进行通信。我会在以后的文章中慢慢和大家讨论的(其实关键是有一些东西还没有悟透,不敢拿出来丢人^%^)。

给大家个好站:http://www.opengroup.org/onlinepubs/007908799/  在线的man手册,有什么不明白的地方可以到这里查询。可惜,是E文的。
由于我是菜鸟,或许有什么不对的地方。也可能一些细节我没有考虑到。如果你知道的话希望不惜指教。小弟感激不尽!!

Linux下的多进程编程初步(转载)

最近在学习linux环境高级编程,多进程编程算是编程中的最重要的一个部分了,本文让我学习和明白了很多,所以转载过来。让更多想多线程编程的人学习。只有顶到首页才能让更多的人学习。 文章摘要:     ...
  • luopeiyuan1990
  • luopeiyuan1990
  • 2013年08月28日 18:02
  • 1498

Linux下多进程编程

什么是一个进程?进程这个概念是针对系统而不是针对用户的,对用户来说,他面对的概念是程序。当用户敲入命令执行一个程序的时候,对系统而言,它将启动一个进程。但和程序不同的是,在这个进程中,系统可能需要再启...
  • xiaohou1045917067
  • xiaohou1045917067
  • 2017年11月18日 23:11
  • 203

linux下php多进程编程

转载地址: http://blog.csdn.net/wzllai/article/details/8257091
  • zhxp_870516
  • zhxp_870516
  • 2014年05月04日 18:37
  • 541

Linux下的多进程编程初步

最近在学习linux环境高级编程,多进程编程算是编程中的最重要的一个部分了,本文让我学习和明白了很多,所以转载过来。让更多想多线程编程的人学习。只有顶到首页才能让更多的人学习。 文章摘要:  ...
  • hualicuan
  • hualicuan
  • 2013年08月18日 16:34
  • 469

Linux下的多进程编程(二)

  2.3.5 套接口套接口(socket)编程是实现Linux系统和其他大多数操作系统中进程间通信的主要方式之一。我们熟知的WWW服务、FTP服务、TELNET服务等都是基于套接口编程来实现的。除了...
  • zhouwengui
  • zhouwengui
  • 2009年11月15日 20:25
  • 178

Linux下的多进程编程(理解)

(一) 理解Linux下进程的结构   Linux下一个进程在内存里有三部份的数据,就是“数据段”,“堆栈段”和“代码段”,其实学过汇编 语言的人一定知道,一般的CPU象I386,都有上述三种段寄...
  • h785193391
  • h785193391
  • 2013年11月22日 13:55
  • 512

Linux下多进程编程(C语言)

Linux下多进程编程(C语言) 一、    进程简介 1、进程是程序的执行。程序是静态的,进程是动态的。 2、进程在内存中有三部分组成:数据段、堆栈段和代码段。          代码段:就...
  • hnxymjj
  • hnxymjj
  • 2012年09月14日 21:53
  • 6832

linux下的多进程编程

多进程编程:随着CPU运算能力的提高,为了提高CPU的使用效率,引入了多进程机制,使得终端用户可以在一台机械同时并行做N件事。宏观上并行,微观上串行。...
  • bijibenzhulin
  • bijibenzhulin
  • 2015年11月04日 18:25
  • 130

Linux下的多进程编程(一)

Linux下的多进程编程(一) 什么是一个进程?进程这个概念是针对系统而不是针对用户的,对用户来说,他面对的概念是程序。当用户敲入命令执行一个程序的时候,对系统而言,它将启动一个进程。但和程序不同的是...
  • zhouwengui
  • zhouwengui
  • 2009年11月15日 20:24
  • 233

Linux下的多进程编程(转)

IPC:Internet  Process  Connection 进程间通信 进程间通信方法: 1.管道   pipe : 一种半双工的通信方式,数据单向流动,只有亲缘关系进程间使用 ...
  • LUOYING198791
  • LUOYING198791
  • 2014年03月07日 15:37
  • 376
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux下多进程编程简介
举报原因:
原因补充:

(最多只允许输入30个字)