首页 > 系统相关 >进程间通信-信号-pipe-fifo

进程间通信-信号-pipe-fifo

时间:2022-11-13 18:48:07浏览次数:33  
标签:pipe int void fifo 间通信 管道 printf 进程 include

一、有名管道FIFO

1.在有名管道(named pipe或FIFO)提出后,管道(pipe)限制得到了克服。

  • 值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。
  • 它们不支持诸如lseek()等文件定位操作。

二、管道PIPE

管道是Linux中进程间通信的一种方式。这里所说的管道主要指无名管道,它具有以下特点:

  • 它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)。

  • 它是一个半双工的通信模式,具有固定的读端和写端。需要双方通信时,需要建立起两个管道。

  • 管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read()和write()等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内核的内存空间中。

  • 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

三、SIGNAL

多任务操作系统环境﹣多进程:

  • 同步关系:多进程为了完成同一个任务相互协作

  • 互斥关系:不同进程为了争夺有限的系统资源,进入竞争状态

  • 进程之间的互斥与同步关系存在的根源在于临界资源

  • 临界资源是在同一个时刻只允许有限个(通常只有一个)进程可

  • 以访问(读)或修改(写)的资源;

  • 访问临界资源的代码叫做临界区,临界区本身也会成为临界资源。

  • 信号量﹣解决进程之间的同步与互斥问题

  • 称为信号量的变量

  • 在该信号量下等待资源的进程等待队列

  • 对信号量进行的两个原子操作( PV 操作)

1.sigactdemo.c

#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#define	INPUTLEN	100
void inthandler();
int main()
{
	struct sigaction newhandler;
	sigset_t blocked;
	char x[INPUTLEN];
	newhandler.sa_handler = inthandler;
	newhandler.sa_flags = SA_RESTART|SA_NODEFER
		|SA_RESETHAND;
	sigemptyset(&blocked);
	sigaddset(&blocked, SIGQUIT);
	newhandler.sa_mask = blocked;
	if (sigaction(SIGINT, &newhandler, NULL) == -1)
		perror("sigaction");
	else
		while (1) {
			fgets(x, INPUTLEN, stdin);
			printf("input: %s", x);
		}
	return 0;
}
void inthandler(int s)
{
	printf("Called with signal %d\n", s);
	sleep(s * 4);
	printf("done handling signal %d\n", s);
}


image

2.sigactdemo2.c

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

void sig_alrm( int signo )
{
	/*do nothing*/
}

unsigned int mysleep(unsigned int nsecs)
{
	struct sigaction newact, oldact;
	unsigned int unslept;

	newact.sa_handler = sig_alrm;
	sigemptyset( &newact.sa_mask );
	newact.sa_flags = 0;
	sigaction( SIGALRM, &newact, &oldact );

	alarm( nsecs );
	pause();

	unslept = alarm ( 0 );
	sigaction( SIGALRM, &oldact, NULL );

	return unslept;
}

int main( void )
{
	while( 1 )
	{
		mysleep( 2 );
		printf( "Two seconds passed\n" );
	}

	return 0;
}

image

3.sigdemo3.c

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

#define	INPUTLEN	100

int main(int argc, char *argv[])
{
	void inthandler(int);
	void quithandler(int);
	char input[INPUTLEN];
	int nchars;

	signal(SIGINT, inthandler);//^C
	signal(SIGQUIT, quithandler);//^\

	do {
		printf("\nType a message\n");
		nchars = read(0, input, (INPUTLEN - 1));
		if (nchars == -1)
			perror("read returned an error");
		else {
			input[nchars] = '\0';
			printf("You typed: %s", input);
		}
	}
	while (strncmp(input, "quit", 4) != 0);
	return 0;
}

void inthandler(int s)
{
	printf(" Received signal %d .. waiting\n", s);
	sleep(2);
	printf("  Leaving inthandler \n");
}

void quithandler(int s)
{
	printf(" Received signal %d .. waiting\n", s);
	sleep(3);
	printf("  Leaving quithandler \n");
}

image

标签:pipe,int,void,fifo,间通信,管道,printf,进程,include
From: https://www.cnblogs.com/shady545/p/16886556.html

相关文章

  • 进程间通信-信号-pipe-fifo
    进程间通信-信号-pipe-fifo有名管道FIFO无名管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(namedpipe或FIFO)提出后,该限制得到了克......
  • 进程间通信-信号-pipe-fifo
     任务详情编译运行附件中的代码,提交运行结果截图理解代码,特别是相关系统调用的使用。Linux进程间通信进程是程序运行资源分配的最小单位。每个进程各自有不同的用户......
  • 进程间通信-信号-pipe-fifo
    进程间通信-信号-pipe-fifo一、fifo1testmf.c——创建一个fifo2producer/consumer生产者和消费者二、pipe1pipe.c获取参数,执行命令2pipedemo.c获取键盘输......
  • 进程间通信-信号-pipe-fifo
    一、有名管道(FIFO)相关概念FIFO(Firstin,Firstout)为一种特殊的文件类型,它在文件系统中有对应的路径。当一个进程以读的方式打开该文件,而另一个进程以写的方式打开该......
  • 进程间通信-信号-pipe-fifo
    fifo管道在有名管道(namedpipe或FIFO)提出后,管道(pipe)限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FI......
  • 20201317 LYX Linux进程间通信学习
    Linux进程间通信1、匿名管道:pipe2、命名管道:fifo3、内存映射:mmap4、信号进程是程序运行资源分配的最小单位。每个进程各自有不同的用户地址空间,任何一个进程的全局变......
  • 流式数据库PipelineDB之BF杂谈
    流式数据库PipelineDB1.导语PipelineDB是一个PostgreSQL的一个流式数据库,是pg社区的一个扩展。下面来引入PipelineDB里面的一些概念:1.1什么是流?流是一种允许客户端将时序......
  • 进程间通信的方式
    进程通信的介绍进程间通信(ProcessToProcessCommunication)是指在并行计算过程中,各进程之间进行数据交互或消息传递,其通信量的大小主要取决于并行设计的粒度划分和各个......
  • 进程间通信-信号-pipe-fifo
    编译运行附件中的代码,提交运行结果截图理解代码,特别是相关系统调用的使用。一、有名管道FIFOFIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文......
  • 进程间通信-信号-pipe-fifo
    1.PIPE1.pipe.c:调用参数所对应的命令2.pipedemo.c:创建一个pipe并读/写3.pipedemo2.c4.stdinredir1.c:打印root权限5.stdinredir2.c6.testtty.c7.whotofile.c......