一 进程之间为什么要进行通信?
1. 数据传输 一个进程需要将数据发送到另外一个进程;
2. 资源共享 多个进程之间需要贡献资源;
3. 通知事件 一个进程需要向另外一个线程或一组线程发送消息,通知他们发送了某种事件;
4. 进程控制 有些进程希望完全控制另外一个线程的执行,此时控制进程希望能获取被控制线程的所有操作和运行状态。
二 进程间常用的通信方式
1. 无名管道和有名管道;
2. 信号;
3. 消息队列;
4. 共享内存;
5. 信号量;
6. 套接字。
三 进程间使用无名管道和有名管道进行通信
无名管道(pipe):只能适用于父进程和子进程之间进行通信;
有名管道(fifo): 适用于所有进程之间进行通信。
四 pipe通信方式例子
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main(int args, char *argv[])
{
int pipe_fd[2];
pid_t pid;
char buf[100];
int r_num;
int w_num;
memset(buf,0,sizeof(buf));
if(pipe(pipe_fd)<0)
{
printf("Pipe creat error!\n");
return 0;
}
if((pid=fork())==0)
{
close(pipe_fd[1]);
printf("I am the child!\n");
sleep(2);
if((r_num=read(pipe_fd[0],buf,100))>0)
{
printf("%d bytes read from the pipe is %s\n", r_num, buf);
close(pipe_fd[0]);
exit(0);
}
}
else if(pid>0)
{
printf("I am the paraent!\n");
close(pipe_fd[0]);
if(write(pipe_fd[1],"Hello",5)!=-1)
printf("paraent writes hello\n");
if(write(pipe_fd[1]," pipe!",7)!=-1)
printf("paraent writes pipe\n");
close(pipe_fd[1]);
sleep(3);
waitpid(-1,NULL,0);
exit(0);
}
}
输出结果:
I am the paraent!
paraent writes hello
paraent writes pipe
I am the child!
12 bytes read from the pipe is Hello pipe!
五 有名管道通信例子(FIFO)
fifo_read.cpp
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <errno.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#define FIFO "/home/dxx/myfifo"
int main(int args, char* argv[])
{
char buf_r[100];
int fd = 0;
int num_read = 0;
if(mkfifo(FIFO,O_CREAT|O_EXCL)<0 && (errno != EEXIST))
printf("Can not creat fifoserver!\n");
printf("Preparing for reading bytes...\n");
memset(buf_r,0,sizeof(buf_r));
fd = open(FIFO,O_RDONLY|O_NONBLOCK,0);
if(fd == -1)
{
perror("open error!");
}
while(1)
{
memset(buf_r,0,sizeof(buf_r));
if((num_read = read(fd, buf_r, 100)) == -1)
{
if(errno == EAGAIN)
printf("No data yet!\n");
}
printf("Read %d bytes data is %s\n", num_read,buf_r);
sleep(1);
}
}
fifo_write.cpp
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <errno.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#define FIFO_SERVE "/home/dxx/myfifo"
int main(int args, char* argv[])
{
int fd = 0;
int num_write = 0;
char buf_w[100];
if(args == 1)
printf("Please enter data you want to write!\n");
fd = open(FIFO_SERVE,O_WRONLY|O_NONBLOCK,0);
if(fd == -1)
{
perror("Open Error!");
}
printf("Preparing to write bytes\n");
strcpy(buf_w,argv[1]);
num_write = write(fd, buf_w, 3);
if(num_write == -1)
{
printf("errno is %d\n",errno);
if(errno == EAGAIN)
perror("No data to read");
}
printf("%d bytes data has been written, data is %s\n", num_write, buf_w);
}
输出结果:
Read 0 bytes data is
Read 0 bytes data is
Read 0 bytes data is
Read 0 bytes data is
Read 0 bytes data is
Read 3 bytes data is 123
Read 0 bytes data is
Read 0 bytes data is
Read 0 bytes data is
Read 0 bytes data is
Read 0 bytes data is
Read 0 bytes data is