您的位置:首页 > 运维架构

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

2013-09-16 13:56 274 查看
/*

*

*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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: