这几天学的很多,缺几乎都是零散的,琐碎的,不成文的.想不出来发什么,就随便发几个小程序吧.
文件复制
1命名管道父子进程实现的文件复制
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define SIZE 1024
void childe_do()
{
//创建被复制文件
int fd1 = open("2.ppt",O_WRONLY | O_CREAT,0777);
if(fd1 < 0)
{
perror("open");
return ;
}
//打开管道
int fd_mkfifo = open("/home/leo/mkfifo",O_RDONLY);
if(fd_mkfifo < 0)
{
perror("open");
return ;
}
char buf[SIZE] = {0};
int ret ;
while(ret = read(fd_mkfifo,buf,SIZE)) //读取管道
{
if(ret == -1)
{
perror("read");
break ;
}
write(fd1,buf,ret); //写入文件
}
close(fd_mkfifo);
close(fd1);
}
void parent_do()
{
//打开要复制的文件
int fd1 = open("1.ppt",O_RDONLY);
if(fd1 < 0)
{
perror("open");
return ;
}
//打开管道
int fd_mkfifo = open("/home/leo/mkfifo",O_WRONLY);
if(fd_mkfifo < 0)
{
perror("open");
return ;
}
char buf[SIZE] = {0};
int ret;
while(ret = read(fd1,buf,SIZE))
{
if(ret == -1)
{
perror("read");
break ;
}
write(fd_mkfifo,buf,ret);
}
close(fd_mkfifo);
close(fd1);
}
int main()
{
int ret = mkfifo("/home/leo/mkfifo", 0777);
if(ret < 0 )
{
perror ("mkfifo");
return -1;
}
pid_t pid = fork();
switch (pid)
{
case -1:
perror("fork");
break;
case 0 :
childe_do();
break;
default :
parent_do();
break;
}
return 0;
}
2 无名管道父子进程的文件复制
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define SIZE 1024
void childe_do(int *fd)
{
//关闭管道写端
close(fd[1]);
int fd1 = open("2.ppt",O_WRONLY | O_CREAT,0777);
if(fd1 < 0)
{
perror("open");
close(fd[0]);
return ;
}
char buf[SIZE] = {0};
int ret ;
while(ret = read(fd[0],buf,SIZE)) //读取管道
{
if(ret == -1)
{
perror("read");
break ;
}
write(fd1,buf,ret); //写入文件
}
close(fd[0]);
close(fd1);
}
void parent_do(int * fd)
{
//关闭管道读端
close(fd[0]);
int fd1 = open("1.ppt",O_RDONLY);
if(fd1 < 0)
{
perror("open");
close(fd[1]);
return ;
}
char buf[SIZE] = {0};
int ret;
while(ret = read(fd1,buf,SIZE))
{
if(ret == -1)
{
perror("read");
break ;
}
write(fd[1],buf,ret);
}
close(fd[1]);
close(fd1);
}
int main()
{
int fd[2] = {0};
//创建无名管道,成功返回0,错误返回-1
int piep = pipe(fd);
if(pipe < 0)
{
perror("pipe");
return -1;
}
pid_t pid = fork();
switch (pid)
{
case -1:
perror("fork");
break;
case 0 :
childe_do(fd);
break;
default :
parent_do(fd);
break;
}
return 0;
}