1、pipe
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
int fd[2];
pipe(fd);
pid_t pid;
int n =2,i = 0;
for(i = 0; i < n ; i ++){
pid = fork();
if(pid == 0){
break;
}
}
//i = 0 ,代表兄长,1 - 代表弟弟,2- 父亲
if(i == 0){
//兄长进程
//1. 关闭读端
close(fd[0]);
//2. 重定向
dup2(fd[1],STDOUT_FILENO);
//3. 执行 execlp
execlp("ps","ps","aux",NULL);
}else if(i == 1){
//弟弟
//1. 关闭写端
close(fd[1]);
//2. 重定向
dup2(fd[0],STDIN_FILENO);
//3. 执行ececlp
execlp("grep","grep","bash",NULL);
}else if(i == 2){
//parent
//父亲需要关闭读写两端
close(fd[0]);
close(fd[1]);
//回收子进程
wait(NULL);
wait(NULL);
}
return 0;
}
2、fifo
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc,char * argv[])
{
if(argc != 2){
printf("./a.out fifoname\n");
return -1;
}
// 当前目录有一个 myfifo 文件
//打开fifo文件
printf("begin open ....\n");
int fd = open(argv[1],O_WRONLY);
printf("end open ....\n");
//写
char buf[256];
int num = 1;
while(1){
memset(buf,0x00,sizeof(buf));
sprintf(buf,"xiaoming%04d",num++);
write(fd,buf,strlen(buf));
sleep(1);
//循环写
}
//关闭描述符
close(fd);
return 0;
}
3、mmap内存
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
int main(int argc, char const *argv[])
{
//创建并截断文件
int fd = open("mem.txt",O_RDWR|O_CREAT|O_TRUNC,0664);
//扩展文件,不能用大小为0的文件
ftruncate(fd,8);
//cpp强制类型转换解决,void函数返回地址的问题。
//char *mem = (char*)mmap(NULL,8,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
char *mem = (char*)mmap(NULL,8,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(mem == MAP_FAILED){
perror("mmap err");
return -1;
}
strcpy(mem,"world\n");
munmap(mem,8);
close(fd);
return 0;
}