进程间通信Word下载.docx

上传人:b****4 文档编号:15907753 上传时间:2022-11-17 格式:DOCX 页数:17 大小:20.37KB
下载 相关 举报
进程间通信Word下载.docx_第1页
第1页 / 共17页
进程间通信Word下载.docx_第2页
第2页 / 共17页
进程间通信Word下载.docx_第3页
第3页 / 共17页
进程间通信Word下载.docx_第4页
第4页 / 共17页
进程间通信Word下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

进程间通信Word下载.docx

《进程间通信Word下载.docx》由会员分享,可在线阅读,更多相关《进程间通信Word下载.docx(17页珍藏版)》请在冰豆网上搜索。

进程间通信Word下载.docx

说明:

本系统调用产生一个新的进程,叫子进程,是调用进程的一个复制品.调用进程叫父进程,

子进程继承了父进程的几乎所有的属性:

.实际UID,GID和有效UID,GID.

.环境变量.

.附加GID.

.调用exec()时的关闭标志.

.UID设置模式比特位.

.GID设置模式比特位.

.进程组号.

.会话ID.

.控制终端.

.当前工作目录.

.根目录.

.文件创建掩码UMASK.

.文件长度限制ULIMIT.

.预定值,如优先级和任何其他的进程预定参数,根据种类不同决定是否可以继承.

.还有一些其它属性.

但子进程也有与父进程不同的属性:

.进程号,子进程号不同与任何一个活动的进程组号.

.父进程号.

.子进程继承父进程的文件描述符或流时,具有自己的一个拷贝并且与父进程和其它子进程共享该资源.

.子进程的用户时间和系统时间被初始化为0.

.子进程的超时时钟设置为0.

.子进程的信号处理函数指针组置为空.

.子进程不继承父进程的记录锁.

返回值:

调用成功则对子进程返回0,对父进程返回子进程号,这也是最方便的区分父子进程的方法.

若调用失败则返回-1给父进程,子进程不生成.

例子:

pid_tpid;

if((pid=fork())>

0){

/*父进程处理过程*/

}

elseif(pid==0){

/*子进程处理过程*/

exit(0);

/*注意子进程必须用exit()退出运行*/

else{

printf("

forkerror\n"

);

2,产生进程system调用例子:

产生一个新的进程,子进程执行指定的命令.

stdio.h>

stdlib.h>

intsystem(string)

char*string;

本调用将参数string传递给一个命令解释器(一般为sh)执行,即string被解释为一条命令,

由sh执行该命令.若参数string为一个空指针则为检查命令解释器是否存在.该命令可以同命令行命

令相同形式,但由于命令做为一个参数放在系统调用中,

应注意编译时对特殊意义字符的处理.命令的查找是按PATH环境变量的定义的.命令所生成的后果

一般不会对父进程造成影响.返回值:

当参数为空指针时,

只有当命令解释器有效时返回值为非零.若参数不为空指针,返回值为该命令的返回状态

(同waitpid())的返回值.

命令无效或语法错误则返回非零值,所执行的命令被终止.其他情况则返回-1.

例子1:

charcommand[81];

inti;

for(i=1;

i<

8;

i++){

sprintf(command,"

ps-ttty%02i"

i);

system(command);

例子2:

charbefehl[200];

/*stringbufferforcshcommand*/

char*runserver="

hosts1"

;

/*servername*/

shortshift_act_l;

/*currectshiftnumber*/

charshift_act_c[1];

charshift_beg[20];

/*shiftbegin*/

charshift_end[20];

/*shiftend*/

....

T_report_p->

shift_no='

0'

memcpy(T_report_p->

time_from,"

yyyy-mm-dd

hh:

mi:

ss"

sizeof(T_report_p->

time_from));

time_to,"

yyyy-mm-ddhh:

time_to));

memset(befehl,'

\0'

sizeof(befehl));

sprintf(befehl,"

rsh%s%sprot.sh'

%s%s%c\"

%19.19s\"

\"

%9.9s\"

&

"

runserver,

REPORT_RSH_PATH,

PROD_LOG,

DRUCKER_NAME_1,

shift_no,

time_from,

time_to,

coil_id);

system(befehl);

3,产生进程exec()调用例子:

exec()

执行一个文件

intexecl(path,arg0,...,argn,(char*)0)

char*path,*arg0,...,*argn;

intexecv(path,argv)

char*path,*argv[];

intexecle(path,arg0,...,argn,(char*)0,envp)

char*path,*arg0,...,*argn,*envp[];

intexecve(path,argv,envp)

char*path,*argv[],*envp[];

intexecvp(file,argv)

char*file,*argv[];

这是一个系统调用族,用于将一个新的程序调入本进程所占的内存,并覆盖之,产生新的

内存进程映象.

新的程序可以是可执行文件或SHELL批命令.当C程序被执行时,是如下调用的:

main(intargc,char*argv[],char*envp[]);

argc是参数个数,是各个参数字符串指针数组,envp是新进程的环境变量字符串的指针数组.argc至

少为1,argv[0]为程序文件名,所以,在上面的exec系统调用族中,path为新进程文件的路径名,

file为新进程文件名,若file不是全路径名,系统调用会按PATH环境变量自动找对应的可执行文件

运行.若新进程文件不是一个可执行的目标文件(如批处理文件),则execlp()和execvp()会将该文

件内容作为一个命令解释器的标准输入形成system().arg0,...等指针指向'

结束的字符串,组成

新进程的有效参数,且该参数列表以一个空指针结束.反过来,arg0至少必须存在并指向新进程文件

名或路径名.同样,argv是字符串指针数组,argv[0]指向新进程文件名或路径名,并以一空指针结束.

envp是一个字符串指针数组,以空指针结束,这些字符串组成新进程的环境.在调用这些系统调用前

打开的文件指针对新进程来说也是打开的,除非它已定义了close-on-exec标志.打开的文件指针在

新进程中保持不变,所有相关的文件锁也被保留.调用进程设置并正被捕俘的信号在新进程中被恢复

为缺省设置,其它的则保持不变.新进程启动时按文件的SUID和SGID设置定义文件的UID和GID为有效

UID和GID.新进程还继承了如下属性:

.进程号.

.会话号.

.alarm时钟信号剩下的时间.

.文件创建掩码.

.资源限制.

.用户时间,系统时间,子进程用户时间,子进程系统时间.

.记录锁.

.进程信号掩码.

.信号屏蔽.

.优先级.

.预定值.

调用成功后,系统调用修改新进程文件的最新访问时间.返回值:

该系统调用一般不会有成功返回值,

因为原来的进程已荡然无存.

nowthisprocesswillbepscommand\n"

execl("

/bin/ps"

"

ps"

-ef"

NULL);

二、进程通讯编程

1,Messagequeue队列编程例子

/*****************************************************************************

Excerptfrom"

LinuxProgrammer'

sGuide-Chapter6"

(C)opyright1994-1995,ScottBurkett

*****************************************************************************

MODULE:

msgtool.c

AcommandlinetoolfortinkeringwithSysVstyleMessageQueues

*****************************************************************************/

ctype.h>

sys/ipc.h>

sys/msg.h>

#defineMAX_SEND_SIZE80

structmymsgbuf{

longmtype;

charmtext[MAX_SEND_SIZE];

};

voidsend_message(intqid,structmymsgbuf*qbuf,longtype,char*text);

voidread_message(intqid,structmymsgbuf*qbuf,longtype);

voidremove_queue(intqid);

voidchange_queue_mode(intqid,char*mode);

voidusage(void);

intmain(intargc,char*argv[])

{

key_tkey;

intmsgqueue_id;

structmymsgbufqbuf;

if(argc==1)

usage();

/*Createun

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1