进程与线程(6)

news2024/11/13 15:56:50

有名管道:

目录

有名管道:

1.创建(mkfifo):

2。打开(open):

3.读写(read /write):

4.关闭(close):

5.卸载(remove):

练习:

(1)写文件

(2)读文件

附录:

信号:

1.发送端:

1.signal函数:

2.kill函数:

3.pause函数:

2.信号含义

3.接收端

练习:

 mplayer:


        有名管道===》fifo===》有文件名称的管道

        1):存在于内存中;

        2):在系统中有一个对应名称;

        3):文件大小;0 bytes       

1.创建(mkfifo):

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

        (1)功能:在指定的pathname路径+名称下创建一个权限为mode的有名管道文件。

        (2)参数:a)pathname:要创建的有名管道路径+名称;

                            b)mode  8进制文件权限。

        (3)返回值:成功0;失败-1;

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        printf("Usage: %s <filename>\n",argv[0]);
        return -1;
    }

    if(mkfifo(argv[1], 0666) < 0 && errno != EEXIST)
    {
        perror("mkfifo fail");
        return -1;
    }

    printf("---mkfifo-success\n");
    return 0;
}

2。打开(open):

int open(const char *pathname, int flags);

        因为管道是半双工模式,所有打开方式直接决定当前进程的读写方式。
         一般只有如下方式:
                (1)int fd-read = open("./fifo",O_RDONLY); ==>fd 是固定读端
                (2)int fd-write = open("./fifo",O_WRONLY); ==>fd 是固定写端
        不能是 O_RDWR 方式打开文件。
        不能有 O_CREAT 选项,因为创建管道有指定的mkfifo函数

3.读写(read /write):

ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);

4.关闭(close):

int close(int fd);

5.卸载(remove):

 int remove(const char *pathname);

练习:

(1)写文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

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

	if (argc != 2)
	{
		printf("Usage: %s <filename>\n",argv[0]);
		return -1;
	}

	if (mkfifo(argv[1],0666) < 0 && errno != EEXIST)
	{
		perror("mkfifo fail");
		return -1;
	}
	printf("----mkfifo -- success\n");

	int fd = open(argv[1],O_WRONLY);
	if (fd < 0)
	{
		perror("open fail");
		return -1;
	}

	printf("----open success---\n");
	
	//从键盘输入数据 写到 管道中 

	char buf[1024];
	
	while (1)
	{
		fgets(buf,sizeof(buf),stdin);
		write(fd,buf,strlen(buf)+1);

		if (strncmp(buf,"quit",4) == 0)
		{
			remove(argv[1]);
			close(fd);
			break;
		}
	}

	return 0;
}
(2)读文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

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

	if (argc != 2)
	{
		printf("Usage: %s <filename>\n",argv[0]);
		return -1;
	}

	if (mkfifo(argv[1],0666) < 0 && errno != EEXIST)
	{
		perror("mkfifo fail");
		return -1;
	}
	printf("----mkfifo -- success\n");

	int fd = open(argv[1],O_RDONLY);

	if (fd < 0)
	{
		perror("open fail");
		return -1;
	}

	printf("----open success---\n");
	
	//从管道中读数据 
	char buf[1024];
	while (1)
	{
		read(fd,buf,sizeof(buf));
		printf("buf = %s",buf);

		if (strncmp(buf,"quit",4) == 0)
		{
			remove(argv[1]);
			close(fd);
			break;
		}
	}
	return 0;
}

附录:

  1. 有名管道执行过程过必须有读写端同时存在。如果有一端没有打开,则默认在open函数部分阻塞。

  2. 可以在有亲缘关系的进程间使用。启动的次序可能会导致其中一个稍有阻塞。

  3. 手工操作有名管道实现数据的传送。读: cat  fifoname;写: echo "asdfasdf" > fifoname

信号:

        本身并不能传送大量数据(异步通信);

软中断(软件层面,对中断过程的一种模拟);

1.发送端:

1.signal函数:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

        (1)功能:信号处理函数的注册(安装)函数

        (2)参数:a)signum:要处理的信号的编号(不能被阻塞,一般有三种:[SIG_IGN](忽略);[SIG_DEL](默认操作);自定义);

                            b) handler:对次信号作何处理(为一个指针,指向信号处理的函数。忽略[SIG_IGN]默认操作[SIG_DFL];
        (3)返回值:成功:上一次设置的信号处理函数的入口地址;失败:[SIG_ERR];

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

void sighandler(int signo)
{
    printf("****************d\n",signo);
}

int main(int argc, char *argv[])
{
  //  signal(SIGINT,SIG_IGN);
      signal(SIGINT,sighandler);

    while(1)
    {
        printf("-----hello-----world-----\n");
        sleep(1);
    }
    return 0;
}
2.kill函数:

    int   kill(pid_t pid, int sig);

        (1)功能:通过该函数可以给pid进程发送信号为sig的系统信号。
        (2)参数:a)pid:要接收信号的进程pid;
                            b)sig:当前程序要发送的信号编号 《=== kill  -l
        (3)返回值:成功 0;失败  -1;

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

void sighandler(int signo)
{
    if(signo == 2)
        printf("hahahahahahahahahahahahahah%d\n",signo);
    else if(signo == 10)
        printf("hahahahahahahahahahahahahah%d\n",signo);
}

int main(int argc, char *argv[])
{
    signal(SIGINT,SIG_IGN);
    signal(SIGUSR1,sighandler);

    int i = 0;
    while(1)
    {
        printf("-----hello-----world-----\n");
        sleep(1);
        ++i;
        if(i % 3 == 0)
            kill(getpid(),SIGUSR1);
    }
    return 0;
}
3.pause函数:

int pause(void);

        (1)功能:进程暂停,不再继续执行,除非收到其他信号。

2.信号含义

        kill-l自查

3.接收端

        每个进程都会对信号作出默认响应,但不是唯一响应。
        一般如下三种处理方式:
                        1、默认处理
                        2、忽略处理 9,19
                        3、自定义处理 9,19 捕获

练习:

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

void sighandler(int signo)
{
    printf("wait child!\n");
    wait(NULL);
}

int main(int argc, char *argv[])
{
    signal(SIGCHLD,sighandler);
    pid_t pid = fork();
    if(pid < 0)
    {
        perror("fork fail\n");
        return -1;
    }
    if(pid > 0)
    {
        while(1)
        {

            printf("father pid = %d\n",getpid());
            sleep(1);
        }

    }else if(pid == 0)
    {
        int i = 0; 
        while(i < 5)
        {
            printf("child pid = %d\n",getpid());
            sleep(1);
            ++i;
        }

    }
    return 0;
}

 mplayer:

mplayer -slave -input file=./fifo 1.mp4

echo "stop" > fifo

echo "pause" > fifo

  1. 播放上一曲 下一曲 ;
  2. 播放下一曲;
  3. 关掉当前正在播放。 //就是关

正常播放 //播放模式 (顺序,单曲,随机)
   //mplayer --媒体文件 获取当前的长度 
   //fork一个子进程播 
   //SIGCHILD 信号 
   //直接播放下一曲 

附录(自定义):

自定义信号处理:
    1、必须事先定义自定义函数,必须是如下格式:   

  void fun(int sig)  sig 接收到的信息编号
        {

        }

    2、在所有的信号中有如下两个特列:10 【SIGUSR1】;12 【SIGUSR2】专门预留给程序员使用的未定义信号。

1)程序不可捕获、阻塞或忽略的信号有:SIGKILL,SIGSTOP
2)不能恢复至默认动作的信号有:SIGILL,SIGTRAP
3)默认会导致进程流产的信号有:SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
4)默认会导致进程退出的信号有:SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
5)默认会导致进程停止的信号有:SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
6)默认进程忽略的信号有:SIGCHLD,SIGPWR,SIGURG,SIGWINCH

7)此外,SIGIO在SVR4是退出,在4.3BSD中是忽略;SIGCONT在进程挂起时是继续,否则是忽略,不能被阻塞。

    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

presto高级用法(grouping、grouping sets)

目录 准备工作&#xff1a; 在hive中建表 在presto中计算 分解式 按照城市分组 统计人数 按照性别分组 统计人数 ​编辑 按照爱好分组 统计人数 ​编辑 按照城市和性别分组 统计人数 按照城市和爱好分组 统计人数 按照性别和爱好分组 统计人数 按照城市和性别还有…

【Qt开发】创建并打开子窗口(QWidget)的注意事项 禁止其他窗口点击、隐藏窗口、子窗口不退出的配置和解决方案

【Qt开发】创建并打开子窗口&#xff08;QWidget&#xff09;的注意事项 禁止其他窗口点击、隐藏窗口、子窗口不退出的配置和解决方案 文章目录 新建QWidget测试注意事项不要用多线程方式运行子窗口不要在打开子窗口后用阻塞死等不要用临时变量定义子窗口 禁止其他窗口的点击隐…

【Qt】常用控件QPushButton

常用控件QPushButton QWidget中涉及的各种属性/函数/使用方法&#xff0c;对Qt中的各种控件都是有效的。 QPushButton继承自QAbstractButton。这个类是抽象类&#xff0c;是其他按钮的父类。 QAbstractButton中和QPushButton相关性比较大的属性。 属性说明 text 按钮中的⽂本…

Vue中下载内容为word文档

1.使用 html-docx-js&#xff1a;这是一个将 HTML 转换为 Word 文档的库。 2. 利用 Blob 和 FileSaver.js&#xff1a;创建并下载生成的 Word 文档。 在 Vue.js 中实现步骤如下: 1. npm 安装 html-docx-js 和 file-saver npm install html-docx-js npm install file-saver2.…

CAS-ViT:面向高效移动应用的卷积加性自注意力视觉Transformer

摘要 https://arxiv.org/pdf/2408.03703 视觉转换器&#xff08;Vision Transformers&#xff0c;ViTs&#xff09;以其标记混合器强大的全局上下文能力&#xff0c;在神经网络领域取得了革命性的进展。然而&#xff0c;尽管以往的工作已做出相当大的努力&#xff0c;但成对标…

终于来了!中国首个接入大模型的Linux开源操作系统正式发布!

在AI飞速发展的今天&#xff0c;谁不希望自己的电脑里住着一个AI助手&#xff0c;我们动动嘴皮子就能指挥电脑干活&#xff0c;省时省力&#xff1f;但是Windows Copilot锁了区&#xff0c;很多用户只能“望洋兴叹”。 而现在&#xff0c;国产站出来了&#xff0c;说我们也有A…

Python常用的模块

一、logging模块 一&#xff09;日志级别 critical50 error40 waring30 info20 debug10 notset0 二&#xff09;默认的日志级别是waring&#xff08;30&#xff09;&#xff0c;默认的输出目标是终端 logging输出的目标有两种&#xff1a;1、终端&#xff1b;2、文件 高于warn…

如何查看麒麟系统下的CPU信息

如何查看麒麟系统下的CPU信息 一、使用lscpu命令二、使用cat /proc/cpuinfo命令 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在麒麟&#xff08;Kylin&#xff09;Linux系统中&#xff0c;了解CPU的详细信息对于系统性能调优、故障诊断以…

转债违约,是实体经济高质量发展的一大步?

8月14日&#xff0c;岭南股份公告其发行的可转债无法按期兑付&#xff0c;出现实质违约。8月16日&#xff0c;证券时报发表了一篇“雄文”《国企可转债的刚兑信仰该放下了》&#xff0c;引爆了舆论。 文章内容总结下&#xff0c;就是对投资者一顿批评教育&#xff0c;批评投资者…

leetcode-461. 汉明距离

题目描述 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 示例 1&#xff1a; 输入&#xff1a;x 1, y 4 输出&#xff1a;2 解释&#xff1a; 1 (0 0 0 1) 4 (0 1 0 0) …

Spring7中事务传播机制形象图解

一、Spring的7种事务传播机制 Spring事务传播机制是指在多个事务方法相互调用的情况下&#xff0c;事务如何在方法之间进行传播和管理的机制。通过事务传播机制&#xff0c;可以控制事务的范围和行为&#xff0c;保证多个事务方法的一致性和完整性。Spring提供了七种事务传播行…

Linux系统挂载U盘方法

第一步&#xff1a; 插入U盘&#xff0c;如果能够识别出U盘&#xff0c;则会**出一些信息 第二步&#xff1a; 查看U盘系统分配给U盘的设备名&#xff1b;输入如下命令进行查看&#xff1a; 使用fdisk -l命令查看一下U盘是否有被识别到&#xff0c;及识别的U盘是在哪个位置 …

8.15 day bug

bug1 一个按钮折腾了 两个小时 一直点第一个按钮&#xff0c;然后进去后发现根本没有课程&#xff0c;需要创建workspace&#xff0c;然后各种问题&#xff0c;还是没把课程启动起来&#xff0c;然后去看gitpod使用文档&#xff0c;搞懂工作区到底是怎么回事&#xff0c;一通操…

实用篇| 如何快速搭建“二手系统”的数据库

对于一些程序员最痛苦的是接手一些“二手系统“&#xff0c; 由于年久失修&#xff0c; 加上裁员离职&#xff0c;系统文档不完善等原因&#xff0c; 只留下服务器配置和代码。 接手人&#xff0c;只能对着这些仅存的代码和服务器硬刚&#xff0c; 对服务器硬刚的第二步&#x…

Golang | Leetcode Golang题解之第343题整数拆分

题目&#xff1a; 题解&#xff1a; func integerBreak(n int) int {if n < 3 {return n - 1}quotient : n / 3remainder : n % 3if remainder 0 {return int(math.Pow(3, float64(quotient)))} else if remainder 1 {return int(math.Pow(3, float64(quotient - 1))) * …

学习日志--NAT(Network Address Translation)网络地址转换

目录 一、什么是NAT网络地址转换 二、配置并检查实验环境 三、NAT实现原理 四、NAT实现静态配置一对一 五、NAT实现动态配置一对一 六、PAT端口地址转换一对多 七、NAT优化easyIP的问题 八、NAT网络地址转换PAT多对多转换&#xff08;特殊情况&#xff09; 九、NAT---…

【Harmony OS 4.0】从零开始,快速上手

2019年8月份Harmony OS 1.0&#xff0c; 2020年9月份Harmony OS 2.0 2022年7月份Harmony OS 3.0 2023年3月份Harmony OS 4.0&#xff0c;不兼容 android app 1. 快速上手 1.1 下载并安装 DevEco Studio 1.2 创建项目并初始化 项目 build init 时报错&#xff1a;request to h…

产业经济大脑建设方案(三)

为了加速产业经济的智能化转型&#xff0c;我们建议建立一个全面集成的产业经济大脑系统&#xff0c;该系统结合人工智能、大数据分析和云计算技术&#xff0c;构建数据驱动的决策支持平台。该平台将实时采集和处理产业链各环节的数据&#xff0c;利用智能算法进行深度分析和预…

【C++】C++11新增特性

目录 C11简介&#xff1a; 1、统一的列表初始化&#xff1a; std::initializer_list 2、自动类型推导&#xff1a; auto&#xff1a; decltype&#xff1a; 3、final 和 override final&#xff1a; override&#xff1a; 4、默认成员函数控制&#xff1a; 显示缺省…

网络安全简介(入门篇)

目录 前言 一、什么是网络安全&#xff1f; 二、网络安全的重要性 1、保护数据安全和隐私 2、防止服务中断和数据丢失 3、防止经济损失和法律责任 4、维护公共安全和国家安全 5、提升技术发展和创新 三、网络安全等级保护 1、第一级&#xff08;自主保护级&#xff0…