在windows里进程间的通信主要用到是的消息,而在Linux里管道通信是一个不错的选择。总是觉得在Linux里编程总是让人感觉一目了然。不像在windows里,用个变量的类型都要想变天。 管道分两处,有名的和无名的,无名的叫管道,有名的叫有名管道。两种管道的区别在于一个有名称,一个无名称。管道只能用于有亲系关系的进程间通信,即只能在父进程与子进程或兄弟进程间通信。而有名管道可以用于任何进程间通信。管道有半双工的,即在某一时刻只能有一个进程向管道里读或写。管道因为没有名字所有管道的缓冲大小是受到系统的限制的,不同的系统管道的缓冲大小 是不相同的。可以在/usr/include/linux/limits.h里查看PIPE_BUF的大小 ,在我的系统里为3 #define PIPE_BUF 4096 管道用系统函数pipe()来创建。用man pipe可得到: #include <unistd.h> int pipe(int pipefd[2]); 有一个参数,是一个整形的有两个元素的数组。pipefd[0]是读端,pipefd[1]是写端。看具体怎么创建一个pipe; 1 #include<unistd.h> 2 #include<stdio.h> 3 #include<string.h> 4 #include<sys/types.h> 5 #include<stdlib.h> 6 #include<sys/wait.h> 7 void read_pipe(int fd) 8 { 9 char message[100]; 10 read(fd,message,100); 11 printf("read pipe message:%s",message); 12 } 13 void write_pipe(int fd) 14 { 15 char *message="this is Tuesday!\n"; 16 write(fd,message,strlen(message)+1); 17 } 18 int main() 19 { 20 int fd[2]; 21 pid_t pid; 22 int stat_val; 23 if(pipe(fd)) 24 { 25 printf("create pipe failed!\n"); 26 } 27 pid=fork(); 28 switch(pid) 29 { 30 case -1: 31 printf("fork error!\n"); 32 break; 33 case 0: 34 close(fd[1]); 35 read_pipe(fd[0]); 36 break; 37 default: 38 close(fd[0]); 39 write_pipe(fd[1]); 40 wait(&stat_val); 41 break; 42 } 43 44 } ~ 先定义读端,在读端里用read()函数把管道里的数据读出message里,然后打印出Message。 然后定义写端,在写端里用write()向pipe里写入字符串。在Main里要先在父进程里用pipe()创建一个管道,然后再用fork()创建一个子进程。 接着用一个switch来判断是父进程还是子进程在进行操作。在子进程里,要读管道里的数据先要把父进程里的写端关闭,即关闭fd[1]。然后开始读数据,如果是父进程要写入数据,则要先关闭读端。 要进行全双工的读与写,则要用两个管道里实现。看下面: #include<stdio.h>#include<unistd.h> #include<sys/wait.h> #include<sys/types.h> #include<string.h> #include<stdlib.h> void child_rw_pipe(int rfd,int wfd) { } void parent_rw_pipe(int rfd,int wfd) { } int main() { { } { } { } }
|
|
来自: lifei_szdz > 《linux-ipc》