LinuxC应用开发学习笔记(十五)--管道算法和进程间通信

LinuxC应用开发学习笔记(十五)--管道算法和进程间通信,第1张

LinuxC应用开发学习笔记(十五)--管道算法和进程通信 管道算法和进程间通信 管道的实现
#include 
#include 
#include 
#include 

#define  BUFSIZE 1024 

int main()
{
    int pd[2],len = 0;
    __pid_t  pid;
    char buf[BUFSIZE];

    if(pipe(pd)<0)
    {
        perror("pipe()");
        exit(1);
    }

    pid = fork();
    if (pid<0)
    {
        perror("fork()");
        exit(1);
    }
    if (pid == 0)   //child read
    {
        close(pd[1]);//关闭写端
        len = read(pd[0],buf,BUFSIZE);
        write(1,buf,len);
        close(pd[0]);
        exit(0);
    }
    else            //parent write
    {
        close(pd[0]);
        write(pd[1],"Hello!",6);
        close(pd[1]);
        wait(NULL);
        exit(0);
    }
    


    exit(0);
}

进程间通信
1台机器
1、管道

内核提供,单工通信,自同步机制,

匿名管道
int pipe(int pipefd[2]);//0端作为读端口,1端作为写端口

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define  BUFSIZE 1024 

int main()
{
    int pd[2],len = 0;
    __pid_t  pid;
    int fd;
    char buf[BUFSIZE];

    if(pipe(pd)<0)
    {
        perror("pipe()");
        exit(1);
    }

    pid = fork();
    if (pid<0)
    {
        perror("fork()");
        exit(1);
    }
    if (pid == 0)   //child read
    {
        close(pd[1]);//关闭写端
        dup2(pd[0],0);
        close(pd[0]);
        fd = open("/dev/null",O_RDWR);
        dup2(fd,1);
        dup2(fd,2);
        execl("/usr/local/bin/mpg123","mpg123","-",NULL);
        perror("execl()");
        exit(1);
    }
    else            //parent write
    {
        close(pd[0]);   //关闭读端
        //父进程从网上收取数据往管道当中写
        close(pd[1]);
        wait(NULL);
        exit(0);
    }
    


    exit(0);
}

命名管道

mkfifo
2、XSI -> SysV
IPC -> Inter-Process Communication

主动端:先发包的一方。
被动端:先收包的一方	(先运行,等待收)。

key:ftok (使得双方拿到同一个key值)

消息队列
msgget();	msgsnd、msgrcv
msgop();
msgctl();
消息队列的实现 协议proto.h
#ifndef PROTO_H__
#define PROTO_H__

#define KEYPATH "/etc/services"
#define KEYPROJ 'g'
#define NAMESIZE 1024

struct msg_st
{
    long mtype;
    char name[NAMESIZE];
    int math;
    int chinese;
};

#endif // !PROTO_H__
接收端代码
#include 
#include 
#include 
#include 
#include 
#include 
#include "proto.h"

int main()
{

    key_t key;
    int msgid;
    struct msg_st rbuf;

    key = ftok(KEYPATH,KEYPROJ);
    if (key<0)
    {
        perror("ftok()");
        exit(1);
    }
    
    //创建一个msg
    msgid = msgget(key,IPC_CREAT|0600);
    if (msgid < 0)
    {
        perror("msgget()");
        exit(1);
    }
    
    while (1)
    {
        //接收 打印 接受 打印
        if (msgrcv(msgid,&rbuf,sizeof(rbuf)-sizeof(long),0,0)<0)
        {
            perror("msgrcv()");
            exit(1);
        }
        printf("NAME = %sn",rbuf.name);
        printf("MATH = %dn ",rbuf.math);
        printf("CHINESE = %dn ",rbuf.chinese);
        
    }


    msgctl(msgid,IPC_RMID,NULL); 

    exit(0);
}
发送端代码
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "proto.h"

int main()
{
    key_t key;
    struct msg_st sbuf;

    int msgid;

    key = ftok(KEYPATH,KEYPROJ);
    if (key < 0)
    {
        perror("ftok()");
        exit(1);
    }
    

    msgid = msgget(key,0);
    if (msgid < 0)
    {
        perror("msgget()");
        exit(1);
    }

    sbuf.mtype = 1;
    strcpy(sbuf.name,"xiaohong");
    sbuf.math = rand()%100;
    sbuf.chinese = rand()%100;
    if(msgsnd(msgid,&sbuf,sizeof(sbuf)- sizeof(long),0)<0)
    {
        perror("msgsnd()");
        exit(1);
    }

    puts("OK!");

    exit(0);
}
信号量数组
semget();
semop();
stmctl();

共享内存
shmget();
shmop();
shmctl();

多台机器

3、网络套接字socket

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5702949.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存