/* ~~~~~~~~~~~~~~~ * zhangtoliup-r.c * ~~~~~~~~~~~~~~~ */ /* 本程序用于同一个电脑的两个不同的终端之间的通信*/ #include<stdio.h> #include<unistd.h> #include<stdlib.h> //open #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> //write,read,close #include <unistd.h> //fork #include <unistd.h>//memset #include<string.h>//mkfifo #include<sys/types.h> #include<sys/stat.h> int main(void) { int ok,zhangtoli,litozhang,writeok,readok; char writebuffer[25] ; char readbuffer[25] ; pid_t pid; // mkfifo if ((ok = mkfifo("/root/zhangtoli",S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) )<0) { printf("mkkfifo zhangtoli error!\n"); } else { printf("mkkfifo zhangtoli success!\n"); } if ((ok = mkfifo("/root/litozhang",S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) )<0) { printf("mkkfifo litozhang error!\n"); } else { printf("mkkfifo litozhang success!\n"); } // open if(( zhangtoli = open("/root/zhangtoli",O_RDWR))<0 ) { printf("open zhangtoli error!\n"); } else { printf("open zhangtoli success!\n"); } if(( litozhang = open("/root/litozhang",O_RDWR))<0 ) { printf("open litozhang error!\n"); } else { printf("open litozhang success!\n"); } pid = fork(); // comu if(pid > 0) { while(1) { printf("\n"); memset(writebuffer,0,25); printf("zhangtoli:"); scanf("%s",writebuffer); //write writeok = write(zhangtoli,writebuffer,25); /* if(writeok < 0) { printf("write error\n"); } else { printf("write success!\n"); } */ sleep(0.1); // printf("in faps:"); } } else if (0 == pid) { while(1) { //read printf("\n"); memset(readbuffer,0,25); readok = read(litozhang,readbuffer,25); /* if(readok < 0) { printf("read error\n"); } else { printf("read success!\n"); } */ //output printf("litozhang: %s \n ",readbuffer); sleep(0.1); // printf("in chps:"); } } else { printf("error in fork()!\n"); } return 0; }
编程思路:通过利用mkfifo创建两个管道文件分别是zhangtoli和litozhang,然后在一个客户端,比如说zhangtoliup-r端 我们通过fork()创建子进程,然后在父进程中不断的写入zhangtoli管道,而在子进程中不断的读取litozhang的管道然后打印。编程中遇到的问题:
1. 这种创建管道是要拥有一定的权限的,很可能不能成功,我在ubuntu 11.04上没有做出来,但是在redhat 6.0 上就完成了。
2. 凡是在遇到需要实时打印时,需要注意打印的缓存的问题,养成良好的习惯,输出完了之后一定要加上'\n',这样就清理了缓存。
3. 在读取和清空字节的时候,我们要注意长度的问题,避免自己要读取的长度小于输入的长度,或者清空的长度小于原有读取的长度,一个简单的做法就是把所有的长度都设为总长,这样就减小了出错的可能!