linuxは無名パイプpipeと有名パイプfifoでスレッド間通信を実現

2585 ワード

1.pipe
同じプロセスで実装された異なるスレッド間の通信(IPCプロセス間通信における血縁関係を持つプロセス通信実装方式と同様)
#include  
#include  
#include 
#include 
#include 

using namespace std;

void *func(void * fd)
{
    char str[] = "this is write thread!
"; write( *(int*)fd, str, strlen(str) ); } int main() { int fd[2]; char readbuf[1024]; if(pipe(fd) < 0) { printf("pipe error!
"); } pthread_t tid = 0; pthread_create(&tid, NULL, func, &fd[1]); pthread_join(tid, NULL); sleep(3); // read buf from child thread read( fd[0], readbuf, sizeof(readbuf) ); printf("read buf = %s
", readbuf); return 0; }

2.fifo
異なるプロセスを実現するためのスレッド間通信.異なるプロセスのスレッド間の通信は、異なるプロセス間の通信と同等である.
リードスレッド
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
void *func(void *fd)
{

   char readbuf[1024];
   read( *(int*)fd, readbuf, 30);
   printf("this is Thread_read!
"); printf("Receive message: %s
", readbuf); close(*(int*)fd); } int main() { int fd; char buff[2048]; if(mkfifo("fifo", 0666) < 0 && errno != EEXIST) { printf("create FIFO falied!
"); return 0; } fd = open("fifo", O_RDONLY); if(fd < 0) { printf("open FIFO falied!
"); } pthread_t tid = 0; pthread_create(&tid, NULL, func, &fd); pthread_join(tid, NULL); //sleep(3); return 0; } //g++ -o Thread_read Thread_read.cpp -lpthread

書き込みスレッド
#include 
#include 
#include 
#include 
#include 
void *func(void * fd)
{

    int wri = write(*(int*)fd, "this is Thread_write", 30);
    if(wri < 0)
    {
        printf("wirte fifo failed!
"); } close(*(int*)fd); } int main() { int fd = open("fifo", O_WRONLY); if(fd < 0) { printf("open fifo failed!
"); return 0; } pthread_t tid = 1; pthread_create(&tid, NULL, func, &fd); pthread_join(tid, NULL); // sleep(3); return 0; } //g++ -o Thread_write Thread_write.cpp -lpthread