copy_process.c(采用进程间管道通信方式实现复制)

来源:互联网 发布:淘宝客的原理 编辑:程序博客网 时间:2024/05/23 13:03

/*
 *
 *Filename:  copy_process.c
 *Description: 实现功能主要是,子进程从文件上读取数据,
 *    采用管道通信机制,传递给父进程,由父进程
 *    写入本地另外一个文件中,实现拷贝。
 */

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>

#define BUFFERSIZE   1024


int main(int argc,char *argv[])

{

 if(argc != 3)
 {
  printf("copy <src_filename> <dest_filename>\n");
  exit(-1);

 }

 int filedes[2];      //定义管道,filedes[0]为读端,filedes[1]为写端
 int fd_read;      //read返回值
 int fd_write;      //write返回值
 int pipe_ret;      //pipe返回值
 char tmp[BUFFERSIZE] = {0};   //定义缓存区

 ssize_t ret;      //定义变量,表示字节数
 pid_t p_ret;      //p_ret为fork函数返回值
 
 pipe_ret = pipe(filedes);   //建立管道通信,必须要在fork函数之前
 if (-1 == pipe_ret)
 {
  perror("pipe");
  exit(-1);
 }

 p_ret = fork();      //创建子进程

 if(p_ret == -1)      //返回-1出错
 {
  perror("fork");
  exit(-1);
 }

 else if(p_ret == 0)      //返回0进入子进程
 {
  printf("I am sun process\n");

  fd_read = open(argv[1], O_RDONLY); // 以只读的形式打开文件
  if (-1 == fd_read)
  {
   perror("open");
   exit(-1);
  }

  if(read(fd_read, tmp, BUFFERSIZE) < 0) //将文件内容读到tmp缓存区
  {
   perror("read error!\n");
   exit(-1);
  } 
  printf("从文件中读到内容 : %s",tmp);
 
  close(filedes[0]);     //关闭管道的读端
  
  
  if((ret = write(filedes[1],tmp,strlen(tmp))) < 0) //向管道中写数据
  {
   
   perror("write error!\n");
   exit(-1);
  }
  printf("向管道内写了 %d 个字节\n",ret); 
 }

 else
 {
           
  wait(NULL);
  printf("I am parent process\n");  //提示进入父进程
  close(filedes[1]);      // 关闭写端
  
 
  if((ret = read(filedes[0],tmp,BUFFERSIZE)) < 0) //从管道的读端读取管道内数据
  {
   perror("read error!\n");
   exit(-1);

  }
  printf("从管道内读了%d 个字节\n",ret);
  printf("读取的内容为: %s",tmp);

   // 创建文件
  
  fd_write = open(argv[2], O_WRONLY | O_CREAT, 0777); //打开文件,若不存在则新建并设置权限
  if (fd_write < 0)
  {
   perror("open");
   exit(-1);
  }


  if((ret = write(fd_write, tmp, strlen(tmp))) < 0) //将tmp内数据写入fd_write指向文件中
  {
   perror("write error!\n");
   return -1;
  }
  
  printf("向 %s 中成功写入内容为 %s",argv[2],tmp); //输出提示信息
 }


 exit(0);
}

 

原创粉丝点击