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);
}
*
*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);
}
相关文章推荐
- 采用虚拟命名管道的字符设备和阻塞型I/O实现进程间的通信实现KWIC程序
- Android中进程process间通信的实现方式
- 采用虚拟命名管道的字符设备和阻塞型I/O实现进程间的通信实现KWIC程序
- 采用虚拟命名管道的字符设备和阻塞型I/O实现进程间的通信实现KWIC程序
- 0704 Process继承实现多进程、Pool进程池,进程间通过队列通信,Pool实现多进程实现复制文件
- 采用虚拟命名管道的字符设备和阻塞型I/O实现进程间的通信实现KWIC程序
- 采用虚拟命名管道的字符设备和阻塞型I/O实现进程间的通信实现KWIC程序
- 采用虚拟命名管道的字符设备和阻塞型I/O实现进程间的通信实现KWIC程序
- 利用命名管道实现进程之间的通信 .........
- 匿名管道实现父子进程之间的通信....
- 【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)
- linux进程间的通信方式:管道和FIFO
- 进程间的通信方式——pipe(管道)
- 使用pipe()与fork()函数通过管道实现父子进程之间的通信
- 利用命名管道实现进程之间的通信 .........
- 匿名管道实现父子进程之间的通信....
- 进程间的通信方式:管道
- Python中采用命名管道来做多进程通信
- 应用管道实现父子进程之间的通信
- linux c之通过管道实现兄弟间进程通信: