嵌入式 Linux进程间通信(六)——管道

嵌入式 Linux进程间通信(六)——管道

一、管道

管道是单向的、先进先出的、无结构的、固定大小的字节流。写进程在管道的尾端写入数据,读进程在管道的首端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞;管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。管道存在于系统内核之中,管道只能用于具有亲缘关系进程间的通信。管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。向管道中写入数据时,linux将不保证写入的原子性,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。如果读进程不读走管道缓冲区中的数据,那么写操作将一直阻塞。

#include <unistd.h>

int pipe(int pipefd[2]);

int pipe2(int pipefd[2], int flags);

fd[0]用于读取管道,fd[1]用于写入管道

二、有名管道

有名管道与管道不同,FIFO不是临时的对象,是文件系统中真正的实体,可以用mkfifo命令和mkfifo函数创建。只要有合适的访问权限,进程就可以使用FIFO。有名管道创建后,进程就可以将有名管道当做文件,使用文件IO函数对有名管道进行操作,因此使用有名管道进行通信的进程是不相关的。

#include <sys/types.h>

#include <sys/stat.h>

int mkfifo(const char *pathname, mode_t mode);

读进程:

int main(int argc,char *argv[])

{

int fd;

char buf[255] = {0};

if((mkfifo("fifo",0777) < 0) && (errno != EEXIST))

{

printf("mkfifo failure\n");

return -1;

}

else

{

fd = open("fifo", O_CREAT|O_RDONLY,0777);

while(1)

{

read(fd, buf,255);

printf("%s\n",buf);

}

}

return 0;

}

写进程:

int main(int argc,char *argv[])

{

int fd;

char buf[] = "hello world\n";

if((mkfifo("fifo",0777) < 0) && (errno != EEXIST))

{

printf("mkfifo failure\n");

return -1;

}

else

{

fd = open("fifo",O_CREAT|O_WRONLY,0777);

while(1)

{

write(fd, buf,strlen(buf));

printf("write sucess\n");

sleep(2);

}

}

return 0;

}

时间: 2024-10-04 16:47:05

嵌入式 Linux进程间通信(六)——管道的相关文章

嵌入式 Linux进程间通信(五)——进程间通信简介

嵌入式 Linux进程间通信(五)--进程间通信简介 一.进程间通信简介 Linux的进程通信方式基本上是从Unix平台上的进程通信方式继承而来的.在Unix发展过程中,贝尔实验室和BSD(加州大学伯克利分校的伯克利软件发布中心)是Unix发展的主要贡献者,但两者在进程间通信方面的侧重点有所不同.贝尔实验室对Unix早期的进程间通信方式进行了系统的改进和扩充,形成了 "system V IPC",通信进程局限在本地计算机内:BSD则跳过了进程通信局限在本地计算机的限制,形成了可以在计算

嵌入式 Linux进程间通信(七)——消息队列

嵌入式 Linux进程间通信(七)--消息队列 一.消息队列 消息队列用于同一台机器上的进程间通信,是一个在系统内核中用来保存消息的队列,在系统内核中是以消息链表的形式出现.消息链表中节点的结构用msg声明.消息队列是一种从一个进程向另一个进程发送数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.消息队列可以避免命名管道的同步和阻塞问题,但是每个数据块都有一个最大长度的限制. 1.msgget函数 #include <sys/types.h> #in

嵌入式 Linux进程间通信(四)——Linux系统日志

嵌入式 Linux进程间通信(四)--Linux系统日志 syslog 是一种工业标准的协议,用来记录设备的日志.Linux日志系统由系统日志监控程序syslogd和内核日志监控程序klogd组成,两个监控程序都是守护程序(daemon),且都注册成了系统服务.syslogd专门记录非内核的其他设备所产生的日志,当系统的控制权由系统交给init的时候,日志信息的记录由syslogd负责记录.Klogd主要负责内核所产生的日志.内核日志记录信息由dmesg /var/log/dmesg查看. 常见

嵌入式 Linux进程间通信(十二)——多线程同步

嵌入式 Linux进程间通信(十二)--多线程同步 多线程编程中有三种线程同步机制:互斥锁.信号量.条件量.本文将使用生产者消费者问题编程实践三种线程同步方式. 生产者.消费者问题:生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费.消费者线程从缓冲区中获得物品,然后释放缓冲区.当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来. 一.互斥锁

嵌入式 Linux进程间通信(一)——进程

嵌入式 Linux进程间通信(一)--进程 进程是程序的实例化,是运行中的程序.程序在编译时用链接器,运行时用加载器.进程运行在虚拟地址空间,操作系统中每个进程在独立的地址空间中运行,每个进程的而逻辑地址空间均为4GB(32位系统),0-1G位OS,1G-4G为应用. 每个进程都有一个在操作系统内唯一的进程号,进程号的获取函数有: #include <sys/types.h> #include <unistd.h> pid_t getpid(void);//返回当前运行进程的而进程

嵌入式 Linux进程间通信(二)——exec族函数

嵌入式 Linux进程间通信(二)--exec族函数 exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件.这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件. exec族函数包含如下函数: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int exec

嵌入式 Linux进程间通信(三)——守护进程

嵌入式 Linux进程间通信(三)--守护进程 一.守护进程简介 1.守护进程简介 守护进程(Daemon)是运行在后台.独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件的一种特殊进程.守护进程常常在系统引导装入时启动,在系统关闭时终止.Linux的大多数服务器就是用守护进程实现的.比如,Internet服务器inetd,Web服务器httpd等.同时,守护进程完成许多系统任务.比如,作业规划进程crond等.守护进程的创建本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同

嵌入式 Linux进程间通信(八)——共享内存

嵌入式 Linux进程间通信(八)--共享内存 一.共享内存 共享内存允许两个或更多进程共享给定的内存区,数据不需要在不同进程间进行复制,是最快的进程间通信方式.使用共享内存唯一需要注意的是多个进程之间对给定存储区的同步访问,但共享内存本身没有提供同步机制,通常使用信号量来实现对共享内存访问的同步. 共享内存编程流程:创建共享内存.映射共享内存.使用共享内存.撤销映射操作.删除共享内存 1.创建共享内存 #include <sys/ipc.h> #include <sys/shm.h&g

嵌入式 Linux进程间通信(十一)——多线程简介

嵌入式 Linux进程间通信(十一)--多线程简介 一.线程简介 线程有四种:内核线程.轻量级进程.用户线程.加强版用户线程 1.内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间.支持多线程的内核叫做多线程内核(Multi-Threads kernel ). 2.轻量级进程LWP 轻量级进程(LWP)是一种由内核支持的用户线程,是基于内核线程的高级抽象,只有先支持内核线程,才能有轻量级进程LWP.每一个