通信的六种方式

1.无名管道

无名管道主要是通过pipe创建管道,再用fork创建进程。

#include<stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{

        int fd[2]={0};
        int pid;
        char buffer[128];
     //  int pipe(int pipefd[2]);
        if(pipe(fd)==-1){
        printf("creat pipe fail!\n");
        }
        pid = fork();
        if(pid<0){

        printf("creat child fail\n");
        }
        else if(pid>0){
        sleep(3);
        printf("this is father\n");
        close(fd[0]);
        write(fd[1],"hello from father",strlen("hello from father"));
        wait(NULL);
        }else{

        printf("this is child\n");
        close(fd[1]);
        read(fd[0],buffer,128);
        printf("read from fathe:%s\n",buffer);
        exit(0);
        }

        return 0;
}

2.有名管道

使用fifo函数

读:

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
        int n_read=0;
        char buf[30]={0};
        //int mkfifo(const char *pathname, mode_t mode);
        if(mkfifo("./fifo",0600) == -1 && errno != EEXIST){//创建FIFO管道
                printf("mkfifo failed!\n");
                perror("why");
        }
        int fd = open("./file",O_RDONLY);
         printf("open success\n");
         while(1){
         n_read = read(fd,buf,30);
        // while(!n_read);
                if(n_read){
                printf("read %d by from fifo, contection:%s\n",n_read,buf);
                }
         }
        close(fd);

        return 0;
}

写:

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main()
{
        int cnt =0;
        char *str="message from fifo ";
        //int mkfifo(const char *pathname, mode_t mode);
        int fd = open("./file",O_WRONLY);
         printf("write open success\n");
        while(1){
         write(fd,str,strlen(str));
         sleep(1);
         cnt++;
         if(cnt==5){
         break;

         }
        }

         close(fd);
        return 0;
}

3.消息队列

使用msgsend msgsend等函数

发送:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
struct msgbuf{
long mtype;
char mtext[128];


};

int main()
{
        //huoqu
       //  int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
        //  ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

        //  int msgget(key_t key, int msgflg);

        struct msgbuf sendbuf = {888,"this is message from queue"};
        struct msgbuf readbuf;
        int msgid = msgget(0x1234,IPC_CREAT|0777);
        if(msgid==-1){
        printf("get queue fail\n");
        }
        msgsnd(msgid,&sendbuf,strlen(sendbuf.mtext),0);
        msgrcv(msgid,&readbuf,sizeof(readbuf.mtext),988,0);
        printf("return from get:%s\n",readbuf.mtext);
        return 0;
}

接收:

#include<stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<string.h>
struct msgbuf{
long mtype;
char mtext[128];


};

int main()
{
        //huoqu
       //  int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
        //  ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

        //  int msgget(key_t key, int msgflg);
        struct msgbuf readbuf;
        int msgid = msgget(0x1234,IPC_CREAT|0777);
        if(msgid==-1){
        printf("get queue fail\n");
        }
        msgrcv(msgid,&readbuf,sizeof(readbuf.mtext),888,0);
        printf("read from que:%s\n",readbuf.mtext);
        struct msgbuf sendbuf = {988,"thank you for reach"};
        msgsnd(msgid,&sendbuf,strlen(sendbuf.mtext),0);

        return 0;
}



 

4.共享内存

通过shmget创建,shmmat映射,先写在读。

写:

#include<stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main()
{

//      int shmget(key_t key, size_t size, int shmflg);
        int shmid;
        char *shmaddr;

        key_t key;
        key=ftok(".",1);
        printf("key is :%d \n",key);
        shmid=shmget(key,1024*4,IPC_CREAT|0666);
        if(shmid==-1){
        printf("shmget fail\n");
        exit(-1);
        }
        exit(0);
//      void *shmat(int shmid, const void *shmaddr, int shmflg);

        shmaddr=shmat(shmid,NULL,0);//ying she

        printf("shmat ok\n");
        strcpy(shmaddr,"taoyi");
        printf("write data:%s\n",shmaddr);
        sleep(5);


        shmdt(shmaddr);
        shmctl(shmid,IPC_RMID,0);
        printf("quit \n");

        return 0;
}

读:

#include<stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main()
{

//      int shmget(key_t key, size_t size, int shmflg);
        int shmid;
        char *shmaddr;

        key_t key;
        key=ftok(".",1);

        shmid=shmget(key,1024*4,0);
        if(shmid==-1){
        printf("shmget fail\n");
        exit(-1);
        }
//      void *shmat(int shmid, const void *shmaddr, int shmflg);

        shmaddr=shmat(shmid,NULL,0);//ying she
        printf("shmat ok\n");
        printf("addr:%s\n",shmaddr);
        printf("read data:%s\n",shmaddr);

        shmdt(shmaddr);

        printf("quit \n");
        return 0;
}

5.信号

分为两类:1signal 2.sigaction

signal 收

#include<stdio.h>
#include <signal.h>

void handler(int signum)
{
        printf("get signnum:%d\n",signum);
        switch(signum){
                case 2:
                        printf("SIGINT\n");
                        break;
                case 9:
                        printf("SIGKILL\n");
                        break;
                case 10:
                        printf("SIGUSR1\n");
                        break;



        }

        printf("never quit\n");


}
int main()
{

        //typedef void (*sighandler_t)(int);

       //sighandler_t signal(int signum, sighandler_t handler);
        signal(SIGINT,handler);
        signal(SIGKILL,handler);
        signal(SIGUSR1,handler);
        while(1);

        return 0;
}

signal发

#include<stdio.h>
#include <signal.h>
#include <stdlib.h>

int main(int argc,char **argv)
{
        int signum;
        int pid;
        char cmd[128]={0};


        signum = atoi(argv[1]);
        pid = atoi(argv[2]);
        printf("signum=%d,pid=%d\n",signum,pid);
        //kill(pid,signum);
        sprintf(cmd,"kill -%d %d",signum,pid);
        system(cmd);

        return 0;
}

2 sigaction 收

#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>



void handler(int signum, siginfo_t *info, void *context)
{
        printf("get sigum=%d\n",signum);


        if(context!=NULL){
        printf("get data= %d\n",info->si_int);
        printf("get data= %d\n",info->si_value.sival_int);

        printf("get pid from%d\n",info->si_pid);
        }


}
int main()
{
          //     int sigaction(int signum, const struct sigaction *act,
            //         struct sigaction *oldact);
        struct sigaction act;
        printf("pid=%d\n",getpid());
        act.sa_sigaction=handler;
        act.sa_flags=SA_SIGINFO;  //be able to get message

        sigaction(SIGUSR1,&act,NULL);
        while(1);


        return 0;
}

sigaction 发

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

//  int sigqueue(pid_t pid, int sig, const union sigval value);
int main(int argc, char **argv)
{
        int signum;
        int pid;

        signum = atoi(argv[1]);
        pid =atoi(argv[2]);

        union sigval value;
        value.sival_int = 100;

        sigqueue(pid,signum,value);

        printf("done\n");


        return 0;
}

6.套接字

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
Vue是一种流行的JavaScript框架,它允许您轻松地构建可重用的组件。Vue组件是一个独立的功能部件,它可以通过不同方式进行通信,以实现更好的交互和协作。以下是Vue中六种常用的组件间通信方式: 1. Props Props是一种用于从父组件向子组件传递数据的机制。父组件可以将数据作为属性传递给子组件,并且子组件可以通过props属性来使用这些数据。 2. Events Events是一种Vue组件间通信的双向机制,它允许子组件通过触发事件来向父组件发送消息。父组件可以监听这些事件,并根据需要作出响应。 3. Provide / Inject Provide / Inject是一种用于跨深度嵌套组件之间共享数据的机制。父组件可以通过provide属性将数据传递给子组件,然后子组件可以通过inject属性来访问这些数据。 4. Vuex Vuex是一种Vue状态管理器,它允许您在单个应用程序中管理共享状态。Vuex包含一个中央状态存储库,可以跨组件访问和修改状态,以实现更好的协作和交互。 5. ref 属性 Ref是一种用于访问组件实例的方法,它可以通过设置ref属性来指定组件的名称。然后你就可以通过$refs属性来访问该组件实例,并在组件之间进行通信。 6. $emit 和 $on $emit和$on是Vue的内置事件机制,它允许组件之间进行通信。$emit用于触发事件,而$on则用于监听事件。使用这种方式,您可以轻松地在组件之间传递消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值