linux信号量

Linux下Fork与Exec使用

感情迁移 提交于 2020-02-15 10:04:29
一、引言   对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。fork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程方法。与DOS和早期的Windows不同,Unix/Linux系统是真正实现多任务操作的系统,可以说,不使用多进程编程,就不能算是真正的Linux环境下编程。   多线程程序设计的概念早在六十年代就被提出,但直到八十年代中期,Unix系统中才引入多线程机制,如今,由于自身的许多优点,多线程编程已经得到了广泛的应用。 下面,我们将介绍在Linux下编写多进程和多线程程序的一些初步知识。 二、多进程编程 什么是一个进程?进程这个概念是针对系统而不是针对用户的,对用户来说,他面对的概念是程序。当用户敲入命令执行一个程序的时候,对系统而言,它将启动一个进程。但和程序不同的是,在这个进程中,系统可能需要再启动一个或多个进程来完成独立的多个任务。多进程编程的主要内容包括进程控制和进程间通信,在了解这些之前,我们先要简单知道进程的结构。    2.1 Linux下进程的结构   Linux下一个进程在内存里有三部分的数据,就是"代码段"、"堆栈段"和"数据段"

Linux 进程间通信方式和原理

孤街浪徒 提交于 2020-02-13 15:31:26
Linux 进程间通信方式和原理 进程间的通信方式 进程的概念 进程时操作系统的概念,每当我们执行一个程序时,对于操作系统来讲究创建了一个进程,在这个过程中,伴随着资源的分配和释放。可以认为进程时是一个程序的一次执行过程。 进程通信的概念 进程用户空间是相互独立的,一般而言是不能相互访问的。但很多情况下进程间需要相互通信,来完成系统的某项功能。进程通过与内核及其他进程之间的互相通信来协调它们的行为 进程通信的应用场景 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 资源共享:多个进程之间共享同样的资源。为了做到这一点,需要内核提供锁和同步机制。 进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 进程通信的方式 管道(pipe) 普通管道:通常有两种限制,一是单向传输,二是智能在父子或者兄弟进程间使用。 流管道:去除了第一种限制,为半双工,只能在父子或兄弟进程间使用,可以双向传输。 命令管道:去除了第二种限制,可以在许多并不相关的进程之间进行通信。 信息量

system V信号量和Posix信号量

五迷三道 提交于 2020-02-12 23:20:43
一、函数上的区别 信号量有两种实现:传统的System V信号量和新的POSIX信号量。它们所提供的函数很容易被区分:对于所有System V信号量函数,在它们的名字里面没有下划线。例如,应该是semget()而不是sem_get()。然而,所有的的POSIX信号量函数都有一个下划线。下面列出了它们提供的所有函数清单: Systm V POSIX semctl() sem_getvalue() semget() sem_post() semop() sem_timedwait() sem_trywait() sem_wait() sem_destroy() sem_init() sem_close() sem_open() sem_unlink() 二、使用上的区别 1、XSI system V的信号量是信号量集,可以包括多个信号灯(有个数组),每个操作可以同时操作多个信号灯 posix是单个信号灯,POSIX有名信号灯支持进程间通信,无名信号灯放在共享内存中时可以用于进程间通信。 2、POSIX信号量在有些平台并没有被实现,比如:SUSE8,而SYSTEM V大多数LINUX/UNIX都已经实现。两者都可以用于进程和线程间通信。但一般来说,system v信号量用于 进程间同步、有名信号灯既可用于线程间的同步,又可以用于进程间的同步、posix无名用于同一个进程的不同线程间

linuxC多进程通讯----POSIX信号量

≡放荡痞女 提交于 2020-02-08 09:39:07
文章目录 相关API 使用说明 基本创建、加减、关闭示例 两个进程通过信号量通讯示例 post wait 父子进程通过信号量同步 相关API •sem_t *sem_open (const char *name, int oflag); •sem_t *sem_open (const char *name, int oflag,mode_t mode, unsigned int value); •int sem_close (sem_t *sem); •int sem_post (sem_t *sem); •int sem_wait (sem_t *sem); •int sem_trywait (sem_t *sem); •int sem_timedwait (sem_t *sem, const struct timespec *abs_timeout); •int sem_unlink (const char *name); •int sem_getvalue (sem_t *sem, int *sval); 使用说明 •包含头文件:#include <semaphore.h> •编译时要指定:-lpthread •Pthread: –POSIX threads,操作线程的API标准 –适用于 Unix、Linux、Mac OS 基本创建、加减、关闭示例 #include

Linux-0.11操作系统实验5-信号量的实现和应用

天大地大妈咪最大 提交于 2020-02-04 14:35:29
实验环境: 信号量的实现和应用 实验任务: 在 Ubuntu 下编写程序,用信号量解决生产者——消费者问题; 在 linux-0.11 中实现信号量,用生产者—消费者程序检验之。 用信号量解决生产者—消费者问题 实验要求: pc.c 程序需打开一个文件 buffer.txt 作为共享缓冲区,缓冲区同时最多只能保存 10 个数;创建一个生产者进程和N个消费者进程,其中生产者进程向缓冲区写入连续的整数,0,1,2,……,M,M>=500;消费者进程从缓冲区依次读取数字,每次读一个,并将读出的数字从缓冲区删除,然后将本进程 ID 和数字输出到标准输出。 为什么要有信号量? 对于生产者 来说,当缓冲区满,也就是空闲缓冲区个数为0时,此时生产者不能继续向缓冲区写数,必须等待,直到有消费者从满缓冲区取走数后,再次有了空闲缓冲区,生产者才能向缓冲区写数。 对于消费者 来说,当缓冲区空时,此时没有数可以被取走,消费者必须等待,直到有生产者向缓冲区写数后,消费者才能取数。并且如果当缓冲区空时,先后有多个消费者均想从缓冲区取数,那么它们均需要等待,此时需要记录下等待的消费者的个数,以便缓冲区有数可取后,能将所有等待的消费者唤醒,确保请求取数的消费者最终都能取到数。 也就是说,当多个进程需要协同合作时,需要根据某个信息,判断当前进程是否需要停下来等待;同时,其他进程需要根据这个信息判断是否有进程在等待

linux之间进程通信

扶醉桌前 提交于 2020-02-02 00:17:47
进程间通信方式: 同主机进程间数据交换机制: pipe(无名管道) / fifo(有名管道)/ message queue(消息队列)和共享内存。 必备基础: fork() 创建一个与之前完全一样的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都 复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。    vfork : 与fork用法相同,但是他和父进程共享同样的数据存储,因此无需完全复制父进程的地址空间。 // fork() study example 1#include <unistd.h> #include <stdio.h> int main () { pid_t fpid; //fpid表示fork函数返回的值 int count=0; // fork 会将这个变量存在两个不同的内存中,所以两次count的值都是 1 ,而不是 1,2 。 fpid=fork(); if (fpid < 0) printf("error in fork!"); else if (fpid == 0) { printf("i am the child process, my process id is %d、n",getpid(

#Linux#进程间通信# 信号量(semophore)

偶尔善良 提交于 2020-01-28 08:21:39
信号量本质上是一个计数器( 不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作 ),可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。主要作为进程间以及同一进程内不同线程之间的同步和互斥手段。 它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被 并发 调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域

pthread线程知识要点

匆匆过客 提交于 2020-01-22 14:49:43
pthread线程知识要点 线程之间通信的两个基本问题是互斥和同步。` #include<pthread.h> 一、pthread_create 1、函数原型 int pthread_create(pthread_t tidp,const pthread_attr_t attr,(void )( start_rtn)(void ),void arg); 2、函数功能: pthread_create是类Unix操作系统(Unix、Linux、Mac OS X等)的创建线程的函数。 它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。 返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于指定各种不同的线程属性。 新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg, 如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。 3、返回值: 表示成功,返回0;表示出错,返回-1。 4、参数 第一个参数为指向线程标识符的指针。 第二个参数用来设置线程属性。 第三个参数是线程运行函数的起始地址。 最后一个参数是运行函数的参数。 示例: // 线程的运行函数 void say_hello(void args) {

进程同步与通信

倾然丶 夕夏残阳落幕 提交于 2020-01-21 00:06:55
进程同步与通信 操作系统教程: http://c.biancheng.net/cpp/html/2592.html 进程的同步与互斥是指进程在推进时的相互制约关系。 # 进程同步 :它主要源于进程合作,是进程间共同完成一项任务时直接发生相互作用的关系。为进程之间的直接制约关系。如生产者-消费者问题,哲学家进餐问题。 # 进程互斥 :它主要源于资源共享,是进程之间的间接制约关系。在多道系统中,每次只允许一个进程访问的资源称为临界资源,进程互斥就是保证每次只有一个进程使用临界资源。如访问控制台、打印机。 为禁止两个进程同时进入临界区,同步机制应遵循以下准则: 空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。 忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待。 有限等待:对请求访问的进程,应保证能在有限时间内进入临界区。 让权等待:当进程不能进入临界区时, 应立即释放处理器,防止进程忙等待 。 进程同步和互斥在不同的系统中有不同的实现。 Windows中的进程同步方法有信号量、事件,互斥方法有临界区、互斥锁。 Linux中的进程同步方法有?? 互斥方法有?? 信号量是一种功能较强的机制, 可用来解决互斥与同步 的问题,它只能被两个标准的原语wait(S)和signal(S)来访问,也可以记为“P操作”和“V操作”。 Wait 原语的实现 void

Linux 信号量使用方法

风流意气都作罢 提交于 2020-01-18 04:06:48
信号量和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区。 不多做解释,要使用信号量同步,需要包含头文件semaphore.h。 主要用到的函数: int sem_init(sem_t *sem, int pshared, unsigned int value); 其中 sem 是要初始化的信号量, pshared 表示此信号量是在进程间共享还是线程间共享,value是信号量的初始值。 int sem_destroy(sem_t *sem); ,其中 sem 是要销毁的信号量。只有用 sem_init 初始化的信号量才能用 sem_destroy 销毁。 int sem_wait(sem_t *sem); 等待信号量,如果信号量的值大于0,将信号量的值减1,立即返回。如果信号量的值为0,则线程阻塞。相当于P操作。成功返回0,失败返回-1。 int sem_post(sem_t *sem); 释放信号量,让信号量的值加1。相当于V操作。 //用户从终端输入任意字符然后统计个数显示,输入end则结束 //使用多线程实现:主线程获取用户输入并判断是否退出,子线程计数 #include<stdio.h> #include <pthread.h> #include<stdlib.h> #include <string.h> #include