1.介绍:
1)同一主机:
unix进程通信方式:无名管道,有名管道,信号
system v方式:信号量,消息队列,共享内存
2)网络通信:Socket,RPC
2.管道:
无名管道(PIPE):使用一个进程的标准输出作为另一个进程的标准输入建立的一个单向管道,执行完成后消失。主要用于父进程与子进程之间,或者两个兄弟进程之间。采用的是单向
1)创建无名管道:(#include(unistd.h))
extern int pipe(int pipes[2]),pipes[0]完成读操作,pipes[1]完成写操作。
1 #include <unistd.h> 2 #include <stdio.h> 3 int main(){ 4 int pipes[2]; 5 if(pipe(pipes)<0){ 6 printf("pipe create failed.\n"); 7 return-1; 8 } 9 else{ 10 printf("pipe create successfully.\n"); 11 close(pipe_filed[0]); 12 close(pipe_filed[1]); 13 } 14 }
父子进程通信:
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <string.h> 4 #include <sys/wait.h> 5 int main(){ 6 char buf[128]; 7 int pipes[2]; 8 if(pipe(pipes)< 0){ 9 printf("Create pipe failed.\n"); 10 return-1; 11 } 12 memset(buf,0,128); 13 int pid; 14 pid= fork(); 15 if(pid== 0){ 16 printf("In child process.\n"); 17 close(pipes[1]); 18 read(pipes[0],buf, 128); 19 printf("%s.\n",buf); 20 close(pipes[0]); 21 } 22 else if(pid > 0){ 23 printf("In parent process.\n"); 24 close(pipes[0]); 25 write(pipes[1],"Hello\n ",6); 26 close(pipes[1]); 27 wait(NULL); 28 } 29 return 0; 30 }
3.有名管道(FIFO):
依赖具体文件系统,是一个存在的特殊文件,实现进程对文件系统下某文件的访问,有名管道和普通文件有一样的属性,如磁盘路径,文件权限等,但并不是存放在磁盘,而在内存中,只拥有磁盘接口。
创建有名管道:
extern int mkfifo(char *path,mode_t mode)
1 #include<stdlib.h> 2 #include<stdio.h> 3 #include<sys/types.h> 4 #include<sys/stat.h> 5 int main() 6 { 7 int res = mkfifo("/home/code", 0777); 8 if(res == 0) 9 { 10 printf("FIFO created\n"); 11 } 12 exit(EXIT_SUCCESS); 13 }
时间: 2024-12-23 19:35:32