linux—进程通信

1)无名管道
半双工通信:只能读或者只能写
                       只有具有亲缘关系的进程才能够使用。
   #include 
   int pipe(int pipefd[2]);
``参数:-pipefd[0]:用于读管道
          -pipefd[1]:用于写管道
        -返回值:成功返回0,失败返回-1
        
   一般使用流程:
``(1)创建进程
	pid_t pid=fork();
	if(pid==-1){
     
		perror("创建进程失败!\n");
		exit(1);
     }
   (2)创建管道
    rc=pipe(pipefd);
    if(rc=-1){
     
		perror("creat pipe failed!\n");
		exit(1);
	}3)写入数据
     void write_data(int pipefd[]){
     
	 int c,rc;
	 close(pipefd[1]);
	 while{
     (rc=read(pipefd[0],&c,1)>0)}{
     
		putchar(c); 
	 }  
	 exit(0);
    }4)读取数据
    void read_data(int pipe[]){
     
	int rc;
	close(pipefd[1])
	while((c=getchar())>0){
     
		rc=write(pipefd[1],&c,1);
		if(rc==-1){
     
			perror("写入失败!\n");
			exit(1);
		}
    }
```	close(pipefd[1]);
	exit(0);
}5)关闭管道

2)有名管道
   给文件系统提供一个路径,这个路径和管道关联,只要
知道这个管道路径,就可以进行文件访问,先进先出,不受亲缘关系限制。
 #include 
 #include 
 int mkfifo(const char *pathname, mode_t mode);
   -参数pathname;管道名称
   -参数mode:管道权限
   -返回值:成功返回0,失败返回-1
  一般使用流程:
  (1)判断管道是否存在
       #include 
       int access(const char *pathname, int mode);
       参数:-pathname:管道路径
            -mode: F_OK,R_OK,W_OK,X_OK
            -返回值:成功返回0,失败返回-12)创建管道
        res = mkfifo(fifo_name, 0777);  
        if(res != 0)  
        {
       
            fprintf(stderr, "Could not create fifo %s\n", fifo_name);  
            exit(EXIT_FAILURE);  
        }3)写入数据
     res = write(pipe_fd, buffer, bytes_read);  
     if(res == -1)  {
       
          fprintf(stderr, "Write error on pipe\n");  
          exit(EXIT_FAILURE);  
    }4)读取数据
      bytes_read = read(data_fd, buffer, PIPE_BUF); 
   (5)关闭管道



你可能感兴趣的:(linux进程,linux)