垃圾回收站

July 19, 2007

Linux并发程序设计

[ 分类: Linux ] 由 弗里曼·潘 发表于 4:48 am

背景知识

管道是Linux中最常用的进程间通信IPC机制。利用管道时,一个进程的输出可成为另外一个进程的输入。当输入输出的数据量特别大时,这种IPC机制非常有用。可以想象,如果没有管道机制,而必须利用文件传递大量数据时,会造成许多空间和时间上的浪费。

Linux中,通过将两个file结构指向同一个临时的索引节点,而两个索引节点又指向同一个物理页而实现管道。

实验目的

1) 通过在Linux进程之间进行的通信实例来学习并发程序设计的方法。

2) 通过Linux进程通信的程序设计与实现,进一步熟悉操作系统的进程概念,理解Linux进程管理概念。

3) 通过阅读和分析Linux实验程序,学习Linux程序设计、调试和运行的方法。

工具/准备工作

在开始本实验之前,请回顾教科书的相关内容。

需要准备一台运行Linux操作系统的计算机。

实验内容与步骤

并发程序的设计关键是使用创建进程的系统调用,使一个程序运行时可以生成几个同时运行的程序,如果程序中没有创建进程的动作则为顺序程序设计。

本实验中的并发程序例子完成两个程序childfather之间的数据传递工作,具体做法分为四步。

步骤1编制并发程序pipeline.c

单击红帽子,在”GNOME帮助”菜单中单击”附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为pipeline.c

在该程序中定义管道和文件描述符,并且创建子进程child。该程序用到的系统调用有pipe() dup() fork() closeexecl() exit,它们的功能分别是建立管道、复制文件描述符、创建进程并使子进程与父进程有相同的程序正文、关闭文件描述符、用指定文件覆盖调用程序、撤销当前进程。

清单4-5 pipeline.c

// 定义管道程序

# define STD_INPUT 0 // 定义标准输入设备描述符

# define STD_OUTPUT 1 // 定义标准输出设备描述符

int fd[2];

main()

{

static char process1[]=”father”,process2[]=”child”;

pipe(fd); // 定义管道

pipeline(process1,process2); // 调用自定义函数pipeline()

exit(1); // 程序结束

}

pipeline(char* process1,char* process2)

{

int i;

while ((i=fork())==-1); // 创建进程,直到创建成功为止

if (i)

{

close(fd[0]); // 关闭管道输入描述符

close(STD_OUTPUT); // 关闭标准输出描述符1

dup(fd[1]); // 指定标准输出描述符1为管道写指针

close(fd[1]); // 关闭原始管道写指针

execl(process1, process1, 0); // 用程序father覆盖当前程序

printf(” father failed.\n”); // execl()执行失败

}

else

{

close(fd[1]); // 关闭管道输出描述符

close(STD_INPUT); // 关闭标准输入描述符0

dup(fd[0]); // 指定标准输入描述符0为管道读指针

close(fd[0]); // 关闭原始管道读指针

execl(process2,process2,0); // 用程序child覆盖当前程序

printf(”child failed.\n”); // execl()执行失败

}

exit(2); // 程序结束

}

步骤2编制”管道写”程序father.c作为父进程的一部分工作。其内容如下:

单击红帽子,在”GNOME帮助”菜单中单击”附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为father.c

清单4-6 father.c

main()

{

static char string[] = “Parent is using pipe write.” ;

int len;

len = sizeof(string) ;

write(l, string, len) ; /* string中的内容写入管道中*/

printf(”parent, parent, parent \n \n \n” ) ;

exit(0) ;

}

步骤3编制”管道读”程序child.c作为子进程的一部分工作。其内容如下:

单击红帽子,在”GNOME帮助”菜单中单击”附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为child.c

清单4-7 child.c

main()

{

char output[30] ;

read (0, output, 30) ; /* 从管道中读数据并存入output*/

printf(”%s \n child, child. \n” , output) ;

return(0) ;

}

步骤4编译。

cc -o child child.c

cc -o father father.c

cc -o pipeline pipeline.c

步骤5运行。

./pipeline

若运行不成功,则应该用文本编辑器对源程序进行修改调试。

运行显示结果为:

____________________________________________________________________

________________________________________________________________________

________________________________________________________________________

提示本实验程序例子中forkexeclpipeclosedupreadwrite等是系统调用,它们的使用方法细节可参见程序员参考手册。


0 条评论 »

还没有人对这篇文章发表评论,赶紧留一个吧。

RSS feed for comments on this post. TrackBack URI

相关文章:
  • Redhat linux下挂载windows硬件
  • 解读filesystem.c
  • linux下编程需需要的知识
  • 清华梦的粉碎—写给清华大学的退学申请
  • Crontab 笔记
  • linux fork() 函数学习
  • 十二球用天平找异常问题
  • 经营分析工作总结
  • .NET方向高级开发人员面试时应该事先考虑的问题
  • 发表评论