简易聊天程序的编写<2>————————————长标题!

来源:互联网 发布:小黑屋码字软件 编辑:程序博客网 时间:2024/05/22 04:48
/*~~~~~~~~~~~~~~~* litozhangup-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>int main(void){int  zhangtoli,litozhang,writeok,readok;char writebuffer[25] ;char readbuffer[25] ;pid_t pid;// open/* 打开由zhangtoli.c 创建的管道 */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");}// comu/* 通过fork 创建两个同时进行的进程,这样就可以完成,在同一个shell中同时进行读和写的操作 */pid = fork();if(pid > 0){while(1){/* 此处打印\n 是为了每次在开始循环之前要清理缓存,把打印输出,这样就可以实时响应了 */printf("\n");memset(writebuffer,0,25);printf("litozhang:");scanf("%s",writebuffer);//writewriteok = write(litozhang,writebuffer,25);/*if(writeok < 0){printf("write error\n");}else{printf("write success!\n");}*/sleep(0.1);//printf("in faps:");}}//readelse if( 0 == pid ){while(1){/* 此处打印\n 是为了每次在开始循环之前要清理缓存,把打印输出,这样就可以实时响应了 */printf("\n");memset(readbuffer,0,25);readok = read(zhangtoli,readbuffer,25);/*if(readok < 0){printf("read error\n");}else{printf("read success!\n");}*///outputprintf("zhangtoli: %s\n  ",readbuffer);sleep(0.1);//printf("in chps:");}}else {printf("error in fork()!\n");}return 0;}  


 

               编程思路:通过利用mkfifo创建两个管道文件分别是zhangtoli和litozhang,然后在一个客户端,比如说lizhangtoup-r端 我们通过fork()创建子进程,然后在父进程中不断的写入litozhang管道,而在子进程中不断的读取zhangtoli的管道然后打印。

              编程中遇到的问题:

                        1. 这种创建管道是要拥有一定的权限的,很可能不能成功,我在ubuntu 11.04上没有做出来,但是在redhat 6.0 上就完成了。

                        2. 凡是在遇到需要实时打印时,需要注意打印的缓存的问题,养成良好的习惯,输出完了之后一定要加上'\n',这样就清理了缓存。

                        3. 在读取和清空字节的时候,我们要注意长度的问题,避免自己要读取的长度小于输入的长度,或者清空的长度小于原有读取的长度,一个简单的做法就是把所有的长度都设为总长,这样就减小了出错的可能!

原创粉丝点击