linux进程和进程通信编程(代码片段)

小阿宁的猫猫 小阿宁的猫猫     2023-03-23     137

关键词:

What makes the desert beautiful is that somewhere it hides a well.

沙漠之所以美丽,是因为在它的某个角落隐藏着一口井.

linux进程和进程通信编程(2)

进程间通信

1.管道通信

进程A和进程B是应用层的, 不能直接通信

管道就用于它们之间的通信, 管道存在于内核

不管有名还是无名, 只要管道里面没有内容, 使用read函数就会被阻塞

(1)有名管道

用于任何两个进程都可以

相关程序21write.c , 21read.c

mkfifo

//头文件
#include <sys/stat.h>
#include <unistd.h>


要一边写一边读, 才能读到

21write.c , 21read.c代码

21write.c

#include <stdio.h> //用于main函数
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <unistd.h> //用于close,read,write,fork
int main(int argc, char *argv[])

    char buf[32] = 0;
    int fd;
    int ret;

    if (argc < 2)
    
        printf("输入fifo文件名:\\n"); //输入参数太少了,就给提示
        printf("argc:%d\\n", argc);
    
 
    else if (argc = 2)
    
        printf("argc:%d\\n", argc);
        if (access(argv[1], F_OK) == -1)
                                        // access用于判断是否存在键盘输入的那个fifo文件
            ret = mkfifo(argv[1], 0666); //如果不存在的话,就创建一个管道文件
            if (ret == -1)
            
                printf("出错了");
            
            else
                printf("管道建好了");
        

        fd = open(argv[1], O_WRONLY);
        write(fd, "hello111", 8);
        close(fd);
    

21read.c

#include <stdio.h> //用于main函数
#include <stdlib.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h> //用于close,read,write,fork
int main(int argc, char *argv[])

    char buf[32] = 0;

    int fd;
    int ret;

    if (argc < 2)
    
        printf("输入fifo的文件名:\\n"); //输入参数太少了,就给提示
    

    else if (argc = 2)
    
        
        fd = open(argv[1], O_RDONLY);
        read(fd, buf, 32);
        printf("buf:%s\\n", buf);
        close(fd);
    
    

(2)无名管道

用于父子进程

相关程序20.c

无名管道要在子进程之前创建

如果父进程阻塞, 程序会一直卡着

父进程写了,子进程就可以读出来

20.c代码

//无名管道

#include <stdio.h> //用于main函数
#include <stdlib.h>
#include <sys/types.h> //用于pid_t
#include <sys/stat.h>
#include <sys/wait.h>

#include <unistd.h> //用于close,read,write,fork

int main()          //不含参数

    char buf[32]=0;
    
    int fd[2];   //定义管道两端的描述符,有两个
    pipe(fd);    //创建管道
    printf("fd[0]:%d\\n",fd[0]);  //打印读端的fd
    printf("fd[1]:%d\\n", fd[1]); //打印写端的fd

    pid_t pid; //定义一个pid来接收fork的返回值
    pid = fork();

    if (pid < 0)
    
        printf("创建失败");
    

    //父进程
    if (pid > 0)
    
        write(fd[1],"hello",5);             
    

    //子进程
    if (pid == 0)
    
        close(fd[1]);         //关闭写端,只用读
        read(fd[0],buf,32);
        printf("buf:%s\\n",buf);
        close(fd[0]);
    

2.信号通信

具体用到哪个信号 , 上网查就行

(1)信号发送

//头文件
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>

raise

用于自己给自己发信号

相关程序22.1.c

22.1.c代码

#include <stdio.h> //用于main函数
#include <stdlib.h>

#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int main()

    printf("raise之前\\n");

    raise(9);                // raise表示自己给自己发的信号,是不能被捕获的,里面的9表示终止进程
    
    printf("raise之后\\n");

kill

用于kill进程, 和kill命令作用一样

相关程序22-2.c

用22-2.c去杀死22-3.c的进程

22-2.c,22-3.c代码

22-2.c

#include <stdio.h> //用于main函数
#include <stdlib.h>

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

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

    pid_t pid;
    int sig;

    if(argc<3)
        printf("输入被操作的进程pid和信号种类\\n");
    

    sig=atoi(argv[2]);
    pid = atoi(argv[1]);
    kill(pid,sig);

22-3.c

#include <stdio.h> //用于main函数
#include <stdlib.h>

#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int main()

    while(1)
        sleep(1);
        printf("hh\\n");
    

alarm

类似于设置一个闹钟,时间到了就kill进程

相关程序22-4.c

22-4.c代码

#include <stdio.h> //用于main函数
#include <stdlib.h>

#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int main()

    int i;
    alarm(4);           //表示在第4s时杀死进程

    while (1)
    
        sleep(1);
        i++;
        printf("i:%d\\n",i);
    
    

(2)信号接收

一个进程要长时间运行才能接收信号

比如用while(1) , sleep(x)(在x秒内一直运行) , pause(一直睡眠)

在进程运行时 , 按ctrl+c , 输kill, 进程就可以接收到这些信号了

用pause

用于让进程运行到一半进入休眠状态 , 会一直休眠, 用signal或ctrl+c退出

相关程序22-5.c

22-5.c代码

#include <stdio.h> //用于main函数
#include <stdlib.h>

#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int main()

    printf("pause之前\\n");

    pause();               // pause表示进入休眠

    printf("pause之后\\n");

(3)信号处理

默认 (终止) , 忽略 , 捕获

用signal

相关程序22-6.c

//头文件
#include <signal.h>

默认

signal(SIGINT,SIG_DFL);
//SIGINT表示ctrl+c,SIG_DFL表示执行ctrl+c的默认操作,就是终止


忽略

signal(SIGINT,SIG_IGN);
//SIGINT表示ctrl+c,SIG_IGN表示忽略ctrl+c这个信号


捕获

signal(SIGINT,myfun);
//捕捉SIGINT这个信号,然后执行myfun里面的代码
//比如按ctrl+c,就执行另一个循环


22-6.c代码

#include <stdio.h> //用于main函数
#include <stdlib.h>

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

// void fun(int sig) 
//     if(sig==SIGINT)
//         while (1)
//         
//             printf("hei hei\\n");
//             sleep(2);
//                 
//        
// 

int main()

    // signal(SIGINT,SIG_IGN);    //忽略
    // signal(SIGINT, SIG_DFL);     //默认
    // signal(SIGINT, fun);        //执行新的函数
    while (1)
    
        printf("hh\\n");
        sleep(2);
    

3.共享内存

用于进程间通信

创建共享内存

shmget

相关程序24-1.c

//头文件
#include <sys/ipc.h>
#include <sys/shm.h>

使用宏作为key值

使用ftok返回值作为key值

24-1.c代码

//创建共享内存,使用宏作为key值

#include <stdio.h> //用于main函数
#include <stdlib.h>

#include <sys/ipc.h>//用于shmget
#include <sys/shm.h>

#include <sys/types.h>

int main()

    int id;

    id = shmget(IPC_PRIVATE, 1024, 0777); // IPC_PRIVATE 使用宏作为key值

    if (id < 0)
    
        printf("共享内存创建失败\\n");
    
    else
        printf("id:%d\\n", id);
    

shmat

用于把内核里的共享内存映射到用户空间

shmdt

将共享内存映射的地址删除

shmctl

删除内核里面的共享内存地址

linux系统编程-进程间通信(管道)(代码片段)

1.进程间通信方式介绍这篇文章介绍Linux下进程的间的通信方式,常用的方式如下:1.socket—网络通信2.管道---无名管道—命名管道---文件--FIFO3.消息队列4.共享内存5.信号量集6.信号—signal捕获信号---kill命令发送信号intkill(pid_tpid... 查看详情

linux系统编程—进程间的通信(代码片段)

系列文章目录往期内容:[Linux系统编程—进程(作业+答案)](https://blog.csdn.net/itcast_cn/article/details/121428213)文章目录系列文章目录IPC方法管道管道的概念:pipe函数创建管道管道的读写行为管道缓冲区大小管道的... 查看详情

linux进程间通信--消息队列相关函数(ftok)详解(代码片段)

ftok消息队列、信号灯、共享内存常用在Linux服务端编程的进程间通信环境中。而此三类编程函数在实际项目中都是用SystemVIPC函数实现的。SystemVIPC函数名称和说明如下表15-1所示。表15-1SystemVIPC函数 消息队列信号灯共享内存区头... 查看详情

linux之进程间通信(代码片段)

进程间通信文章目录进程间通信进程间通信的目的进程间通信分类管道什么是管道匿名管道pipe函数用fork来共享管道原理站在文件描述符角度理解管道管道读写规则管道的特性命名管道systemV共享内存共享内存的基本原理申请共享... 查看详情

linux进程间通信(ipc)总结(代码片段)

概述一个大型的应用系统,往往需要众多进程协作,进程(Linux进程概念见附1)间通信的重要性显而易见。本系列文章阐述了 Linux环境下的几种主要进程间通信手段。进程隔离进程隔离是为保护操作系统中进程互不干扰而设... 查看详情

linux进程间通信(代码片段)

【linux】进程间通信紧接上篇【linux】进程控制,现来讨论进程间通信。01.概念进程是一个独立的资源分配单元,不同进程(这里所说的进程通常指的是用户进程)之间的资源是独立的,没有关联,不能在... 查看详情

进程间的五种通信方式介绍(代码片段)

进程间通信(IPC)介绍 进程间通信(IPC,InterProcessCommunication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Streams支持... 查看详情

linux中进程间通信(代码片段)

一、整体大纲二、进程间通信概念及方法    Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要... 查看详情

linux进程通信之守护进程(代码片段)

守护进程(Daemon)Daemon(精灵)进程,是linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的时间。一般采用以d结尾的名字。从下面的进程信息可以看出,守护进程都是【?】。colord116... 查看详情

qt使用qprocess进程间双向通信(linux和win系统)(代码片段)

...实现实例验证(Linux系统实现)问题分析代码实现Win系统子进程监听实现题外话qprocess如何关闭子进程监听效果图前言最近需要使用一个主进程A,来调用子进程显示,子进程只是单纯的显示一个webview页面,为什么不直接在主进程显... 查看详情

进程间的五种通信方式介绍(代码片段)

进程间通信(IPC,InterProcessCommunication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Streams支持不同主机上的两个进程IPC。... 查看详情

并发编程(代码片段)

一、多进程并发和多线程并发多进程并发有进程间通信机制,更加安全。第一个缺点:进程间通信为避免一个进程修改另一个进程,比如读时共享写时复制使得花销更大;第二个缺点:需要启动进程,还要系统内核来管理进程,... 查看详情

一文让你透彻理解linux的socket编程(含实例解析)(代码片段)

1.网络中进程之间如何通信进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如UNIXBSD... 查看详情

python并发编程—进程间通信(代码片段)

进程间通信(IPC) 1.必要性:进程间空间独立,资源不共享,此时在需要进程间数据传输时就需要特定的手段进行数据通信。  2.常用进程间通信方法:管道通信、消息队列、共享内存、信号量 管道通信(Pipe)1.通信... 查看详情

linux进程间通信——使用systemv消息队列(代码片段)

消息队列消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。... 查看详情

[os-linux]详解linux的进程间通信1------管道(代码片段)

本文详解了Linux中进程间通信,包括了进程间通信的介绍,匿名管道和命名管道。目录一、进程间通信的介绍1.进程间通信目的2.进程间通信分类二、管道1.管道是什么2.匿名管道  (1)pipe (2)实现 (3)用... 查看详情

[os-linux]详解linux的进程间通信1------管道(代码片段)

本文详解了Linux中进程间通信,包括了进程间通信的介绍,匿名管道和命名管道。目录一、进程间通信的介绍1.进程间通信目的2.进程间通信分类二、管道1.管道是什么2.匿名管道  (1)pipe (2)实现 (3)用... 查看详情

linux进程间通信(代码片段)

目录进程间通信介绍进程间通信的概念进程间通信目的进程间通信分类进程间通信的本质管道什么是管道匿名管道匿名管道的原理pipe函数pipe创建匿名管道实例管道读写规则管道的特性命名管道命名管道的原理创建一个命名管道... 查看详情