简易聊天程序的编写<1>————————————长标题!
2011-10-13 10:21
417 查看
/* ~~~~~~~~~~~~~~~ * 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. 在读取和清空字节的时候,我们要注意长度的问题,避免自己要读取的长度小于输入的长度,或者清空的长度小于原有读取的长度,一个简单的做法就是把所有的长度都设为总长,这样就减小了出错的可能!
相关文章推荐
- 简易聊天程序的编写<2>————————————长标题!
- 通俗讲解Makefile编写方法<1>
- unix学习笔记<2> 多线程 udp聊天程序 简单实例
- 编写高质量代码改善C#程序的157个建议——建议122:以<Company>.<Component>为命名空间命名
- 改善C++程序的建议:语法篇1<从C继承而来的特性>
- 编写高质量代码之改善C++程序语法篇2<从C到C++需要做的改变>
- <编写高质量改善java程序的151个建议>----笔记
- 编写高质量代码改善C#程序的157个建议——建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>
- 编写高质量代码改善C#程序的157个建议[勿选List<T>做基类、迭代器是只读的、慎用集合可写属性]
- <1>windows系统用sublime3开发OpenGL程序环境搭建#OpenGL#
- Generic<Programming>:volatile——编写多线程程序的好帮手
- 蛇舞2013抽奖程序的编写和QT技巧问题梳理总结<QT>
- Sys请教下如何用C#开发一个简易的电路模拟程序<qi>
- //编写程序求 vector<double> 对象中所有元素之和
- PYQT5+python3.6+QT编写一个带ui的加密解密小程序<凯撒加密><维吉尼亚加密><仿射加密><培根加密>
- <Head First Java>学习笔记--第五章:编写程序
- 编写一个程序,将两个字符串s1和s2比较,如果s1 > s2,输出一个正数;s1 = s2,输出0,;s1 < s2输出一个负数。不要使用strcmp函数。
- 编写高质量代码改善C#程序的157个建议[IEnumerable<T>和IQueryable<T>、LINQ避免迭代、LINQ替代迭代]
- 编写程序,查找并删除forward_list<int>中的奇数元素