进程互斥的方法,进程通信的基本原理。
用vi编写C语言程序,创建子进程并实现父子进程间的通信,使用gcc编译并运行。
系统平台
Linux
通过fork函数实现进程通信
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/wait.h>
#define BUFSZ PIPE_BUF
int pid1,pid2;
int main ( )//只适用于父子进程之间或者父进程安排的各个子进程之间
{
int fd[2];/[0]为读端,fd[1]为写端
char OutPipe[100],InPipe[100];
pipe(fd);//通过pipe系统调用创建无名管道
while((pid1=fork())==-1);//创建子进程直至成功
if(pid1==0){
lockf(fd[1],1,0);
sprintf(OutPipe,"Child 1 is sending message!");
write(fd[1],OutPipe,50);
lockf(fd[1],0,0);
/eep(5);
exit(0);
}
else{
while((pid2=fork())==-1);
if(pid2==0){
//子进程访问管道时是互斥的
lockf(fd[1],1,0);//加锁定收入端
sprintf(OutPipe,"Child 2 is sending message!");
write(fd[1],OutPipe,50);//通过系统调用write和read进行管道的读写,把缓冲区字符串写入管道
//ep(5);
lockf(fd[1],0,0);//释放管道写入端
//ep(5);
exit(0);
}
else{
//此时执行父进程
wait(0);//阻塞父进程,直到子进程执行完毕
read(fd[0],InPipe,50);//父进程读取其管道字符串
printf("%s\n",InPipe);
read(fd[0],InPipe,50);
printf("%s\n",InPipe);
exit(0);
}
}
return 0;
}
fork函数的使用
fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。
通过fork()返回的不同值,来对程序进行控制。
负值:创建子进程失败。
零:返回到新创建的子进程。
正值:返回父进程或调用者。该值包含新创建的子进程的进程ID