- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
进程概念;
进程的控制:
生成一个进程:fork
进程的同步:wait waitpid
进程的退出:exit _exit
进程“脱胎换骨”:exec函数族
进程通信
进程为什么需要通信?
linux下进程如何通信
早期的unix通信方式
无名管道;有名管道;信号
sysem v的通信方式:共享内存、消息队列、信号量
BSD的通信方式:socket
无名管道:适用于有血缘关系进程通信
小任务1:父进程通过无名管道向子进程发送字符串“Hello,you man!”,子进程接收到后显示出来,然后子进程退出,最后父进程退出。
创建子进程:fork
创建管道
#include unistd.h
int pipe(int pipefd[2]);
参数说明(当管道创建成功后):
pipefd[0]:读端的文件描述符;
pipefd[1]:写端的文件描述
返回值:0表示创建成功,-1表示创建失败
父亲写管道
write
儿子读管道
read
父亲等待儿子退出
wait
参考代码:
#include unistd.h
#include stdio.h
#include fcntl.h
#include sys/types.h
#include string.h
int main()
{
int pid;
int pipefd[2];
int ret;
char buf[]=Hello,young man!;
ret=pipe(pipefd);//创建管道(1)
if(ret0)
{
perror(Failed to create pipe:);
return -1;
}
pid=fork();
//能够把(1)语句放此注释的下一样??
if(pid0)
{
perror(Failed to create child process:);
return -1;
}
if(pid0)
{
close(pipefd[0]);//父进程中关闭无关的读端
write(pipefd[1],buf,strlen(buf));
wait(NULL);
printf(Parent process exit!\n);
}
else
{
char receive_buf[100];
int count;
close(pipefd[1]);//子进程中关闭无关的写端
count=read(pipefd[0],receive_buf,100);
if(count0)
{
receive_buf[count]=\0;
printf(Child process receive a string:%s\n,receive_buf);
}
printf(Child process exit!\n);
}
return 0;
}
有名管道(fifo)
文件系统中可见,可以通过mkfifo 命令来创建一个有名管道
eg: mkfifo -m 0666 myfifo
有名管道的使用跟普通文件一样:open read write close,不用使用lseek!!!!
任务2:
进程1通过有名管道把键盘输入字符串发送给进程2,进程2收到后显示出来,当收到字符串“exit”是退出程序!!
手工建立一个有名管道myfifo
打开管道;
读写管道
注意:有名管道的读写跟普通文件没有什么区别!!
参考代码:
//fifoReader.c
#include unistd.h
#include stdio.h
#include fcntl.h
#include sys/types.h
#include string.h
int main()
{
int fd;
char buf[128];
fd=open(/home/gec/myfifo,O_RDONLY);
if(fd0)
{
perror(Failed to open fifo:);
return -1;
}
while(1)
{
int count;
count=read(fd,buf,127);
if(count0)
{
buf[count]=0;
printf(fifoReader receive a string:%s\n,buf);
}
if(strncmp(buf,exit,4)==0)
{
break;
}
}
close(fd);
return 0;
}
//fifoWrite.c
#include unistd.h
#include stdi
文档评论(0)