Linux Linux程序练习九
题目:利用多线程与有名管道技术,实现两个进程之间发送即时消息,实现聊天功能
思路:关键在于建立两个有名管道,利用多线程技术,进程A中线程1向管道A写数据,进程B中线程2从管道A读数据,进程A线程2从管道B中读数据,进程B中线程1往管道B中写数据。
//利用多线程与有名管道技术,实现两个进程之间发送即时消息,实现聊天功能
//进程A
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //从管道1中读数据
void * Threadread(void * arg)
{
//open the fifo
int fd = ;
//open the fifo in read and write mode--以读写方式打开管道
fd = open("/home/test/1/fifo1", O_RDONLY);
if (fd == -)
{
printf("open the fifo failed ! error message :%s\n", strerror(errno));
return NULL;
}
char buf[] = { };
//从管道中读数据
while (read(fd, buf, sizeof(buf)) > )
{
printf("%s", buf);
memset(buf, , sizeof(buf));
}
close(fd);
return NULL;
} //往管道2中写数据
void * ThreadWrite(void * arg)
{
//open the fifo
int fd = ;
//open the fifo in read and write mode--以读写方式打开管道
fd = open("/home/test/1/fifo2", O_WRONLY);
if (fd == -)
{
printf("open the fifo failed ! error message :%s\n", strerror(errno));
return NULL;
}
char buf[] = { };
while ()
{
//往标准输入上读数据
read(STDIN_FILENO, buf, sizeof(buf));
//在管道中写数据
write(fd, buf, strlen(buf));
memset(buf, , sizeof(buf));
}
close(fd);
return NULL;
} int main(int arg, char * args[])
{
//两线程共用一个文件描述符
pthread_t thr1, thr2;
//创建读数据线程
if (pthread_create(&thr1, NULL, Threadread, NULL) != )
{
printf("create thread is failed ! error mesage :%s\n", strerror(errno));
return -;
}
//创建写数据线程
if (pthread_create(&thr2, NULL, ThreadWrite, NULL) != )
{
printf("create thread is failed ! error mesage :%s\n", strerror(errno));
return -;
}
//等待两线程都返回 关闭文件描述符
pthread_join(thr1, NULL);
pthread_join(thr2, NULL);
return ;
}
.SUFFIXES:.c .o
CC=gcc
SRCS1=tec01.c
SRCS2=tec02.c
OBJS1=$(SRCS1:.c=.o)
OBJS2=$(SRCS2:.c=.o)
EXEC1=a
EXEC2=b start:$(OBJS1) $(OBJS2)
$(CC) -lpthread -o $(EXEC1) $(OBJS1)
$(CC) -lpthread -o $(EXEC2) $(OBJS2)
@echo "^_^-----OK------^_^"
.c.o:
$(CC) -Wall -g -o $@ -c $<
clean:
rm -f $(OBJS1)
rm -f $(OBJS2)
rm -f $(EXEC1)
rm -f $(EXEC2)

Linux Linux程序练习九的更多相关文章
- 嵌入式linux应用程序移植方法总结
嵌入式linux应用程序移植方法总结 前段时间一直在做openCapwap的移植和调试工作,现在工作已接近尾声,编写本文档对前段工作进行一个总结,分享下openCapwap移植过程中的经验和感悟.江浩 ...
- 第六章第一个linux个程序:统计单词个数
第六章第一个linux个程序:统计单词个数 从本章就开始激动人心的时刻——实战,去慢慢揭开linux神秘的面纱.本章的实例是统计一片文章或者一段文字中的单词个数. 第 1 步:建立 Linu x 驱 ...
- Linux C程序内存空间
linux下内存空间布置: 一个典型的Linux C程序内存空间由如下几部分组成: 代码段(.text).这里存放的是CPU要执行的指令.代码段是可共享的,相同的代码在内存中只会有一个拷贝,同时这个段 ...
- linux应用程序地址布局,王明学learn
linux应用程序地址布局 在学习Linux应用程序开发时,经常会遇到如下概念:代码段.数据段.BSS段(Block Started by Symbol,又名:未初始化数据段).堆(heap)和栈(s ...
- linux应用程序开发-文件编程-系统调用方式
在看韦东山视频linux驱动方面有一些吃力,究其原因,虽然接触过linux应用程序编程,但是没有深入去理解,相关函数用法不清楚,正好看到国嵌视频对这一方面讲的比较透彻, 所以把学习过程记录下来,也作为 ...
- 嵌入式Linux应用程序开发详解------(创建守护进程)
嵌入式Linux应用程序开发详解 华清远见 本文只是阅读文摘. 创建一个守护进程的步骤: 1.创建一个子进程,然后退出父进程: 2.在子进程中使用创建新会话---setsid(): 3.改变当前工作目 ...
- linux c程序中获取shell脚本输出的实现方法
linux c程序中获取shell脚本输出的实现方法 1. 前言Unix界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些夸张,但不可否认的是,借助脚本确实能够极大的简化一些编程工作. ...
- 配置开发支持高并发TCP连接的Linux应用程序全攻略
http://blog.chinaunix.net/uid-20733992-id-3447120.html http://blog.chinaunix.net/space.php?uid=16480 ...
- Linux应用程序的地址布局
转载自:http://blog.csdn.net/embedded_hunter http://www.360doc.com/content/12/0405/00/1671317_200882538. ...
- 7 linux服务器程序规范
1. Linux服务器程序一般以后台进程形式运行.后台进程又称守护进程(daemon),它没有控制终端,因而不会意外接收到用户输入.父进程通常为init(PID为1的进程)2. Linux服务器程序常 ...
随机推荐
- Android 开源库和项目
1.手势解锁 史上最完美的 手势密码解锁 2.数据库操作 Android数据库框架itePal https://github.com/LitePalFramework/LitePal 轻量级数据库:a ...
- IOS枚举使用
1.方法一: typedef enum { one = 0, two, }Name; 2.方法二: typedef NS_ENUM(NSInteger, name) { one, two }; 注:a ...
- Core Data的简单用法
#import "ViewController.h" // 第一步:引入头文件AppDelegate #import "AppDelegate.h" #impo ...
- Android 网络编程基础之简单聊天程序
前一篇讲了Android的网络编程基础,今天写了一个简单的聊天程序分享一下 首先是服务端代码: package com.jiao.socketdemo; import java.io.Buffered ...
- 软件工程(c编码实践) 学习笔记(一)
vim 有三种模式:一般模式,编辑模式,命令模式. -------------------------------------------------------------------------- ...
- IOS学习资源收集--关于动画的代码学习资源总汇(很棒的动画效果哦)
目录大纲: 1.很棒的iOS加载动画. github网址:https://github.com/NghiaTranUIT/FeSpinner 游老师的译文blog:http://www.cnblogs ...
- 方程ax2+bx+c=0;一元二次方程。求根
<body>方程ax2+bx+c=0;一元二次方程.求根请输入a:<input type="number" id="a"/><br ...
- Asp.Net远程调试
1.在本地找到VS安装目录下的 Visual Studio Tools 文件夹 并进入Remote Debugger Folder文件夹 2.根据服务器的操作系统是32位还是64位,选择下面的文件夹 ...
- Eclipse 一直提示 loading descriptor for 的解决方法
启动eclipse之后,进行相关操作时,弹出界面,提示:loading descriptor for xxx 解决方法: 在Eclipse左侧的Project Explorer 最右上角有一个小钮,鼠 ...
- 使用backbone.js、zepto.js和trigger.io开发HTML5 App
为了力求运行速度快.响应迅即,我们推荐使用backbone.js和zepto.js. 为了让这个过程更有意思,我们开发了一个小小的示例项目,使用CSS重置样式.Backbone.js和带转场效果的几个 ...