精华内容
下载资源
问答
  • C语言-进程间通信;同步与互斥的概念;同步与互斥; 信号量说明信号量就是操作系统中所用到的PV原语广泛用于进程或线程间的同步与互斥本质上是一个非负的整数计数器被用来控制对公共资源的访问 PV原语是对整数计数器...
  • C语言-进程间通信.pptx

    2020-08-21 00:39:56
    PV原语是对整数计数器信号量sem的操作一次P操作使sem减一而一次V操作使sem加一进程或线程根据信号量的值来判断是否对公共资源具有访问权限 当信号量sem的值大于等于零时该进程或线程具有公共资源的访问权限 相反当...
  • 管道只能用于具有亲缘关系的进程,可以将其看作一个文件,但有别于普通的文件, 管道一次只可以被一个进程访问,能实现互斥; pipe(int fd[] ), 其参数为长度为2的int数组,分别代表读端fd[0], 写端fd[1], 在创建...
  • C语言实现进程同步与互斥

    千次阅读 2020-11-17 16:14:14
    进程同步与互斥 实验原理 (1)同步和互斥(生产者消费者问题) 同步是一种更为复杂的互斥,而互斥是一种特殊的同步。 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制...

    C语言实现进程同步与互斥

    实验原理

    (1)同步和互斥(生产者消费者问题)
    同步是一种更为复杂的互斥,而互斥是一种特殊的同步。
    互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

    同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源
    (2)信号量
    在系统中,给予每一个进程一个信号量,代表每个进程目前的状态,未得到控制权的进程会在特定地方被强迫停下来,等待可以继续进行的信号到来。信号量又存在着两种操作,分别为V操作与P操作,V操作会增加信号量 S的数值,P操作会减少它。
    (3)锁
    在多线程编程中,操作系统引入了锁机制。通过锁机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。
    加锁过程用如下伪码表示:
    1、read lock;
    2、判断lock状态;(0表示资源可用,1表示资源已被占用)
    3、如果已经加锁,失败返回;
    4、把锁状态设置为上锁;
    5、返回成功。

    实验内容和方法

    1.实验一(进程同步):
    1)实验内容
    分别创建两个工程,用来scanf和printf,从键盘输入,在屏幕上显示输入了多少个数,以此来实现进程同步。
    2)代码以及代码分析

    Scanf.c

    #include<stdio.h>
    #include<windows.h>
    int main(){
    		HANDLE h;
    		int a=0;
    		h=CreateSemaphore(NULL,0,10,"scanfcount");
    		while(1)
    		{
    			scanf("%d",&a);
    			printf("%d",a);
    			ReleaseSemaphore(h,1,NULL);
    		}
    }
    

    Printf.c

    #include<stdio.h>
    #include<windows.h>
    int main(){
    		HANDLE h;
    	int count=0;
    	h=CreateSemaphore(NULL,0,10,"scanfcount");
    	
    	while(1)
    	{
    			WaitForSingleObject(h,INFINITE);
    			count++;
    		printf("%d",count);
    
    	
    	}
    }
    

    3)实验结果截图
    每当我在scanf窗口输入一个数,printf窗口的计数器就加1。
    2.实验二(进程互斥):
    1)实验内容
    本次实验中,模拟两个线程实现信号量的争夺(无序性)。通过加锁实现在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。
    2)代码及代码分析

    MultiThread.c

    #include<stdio.h>
    #include<windows.h>
    HANDLE m_hMutex; 
    //线程1
    DWORD WINAPI ThreadFunc1(LPVOID lpParam)
    {
    	int i;
    	for(i=0;i<5;i++)
    	{
    				WaitForSingleObject(m_hMutex,INFINITE);//进入临界区域
    		printf("Thread1 step1 in the critical section\n");
    		printf("Thread1 step2 in the critical section\n");
    		ReleaseMutex(m_hMutex);//释放
    	}
        return 0;
    }
    //线程2
    DWORD WINAPI ThreadFunc2(LPVOID lpParam)
    {
    	int i;
    	for(i=0;i<5;i++)
    	{
    		WaitForSingleObject(m_hMutex,INFINITE);
    		printf("Thread2 step1 int the critical section\n");
    		printf("Thread2 step2 inthe critical section\n");
    		ReleaseMutex(m_hMutex);
    	}
        return 0;
    }
    void main()
    {
    	char c;
    	m_hMutex=CreateMutex(NULL,FALSE,NULL);
    	CreateThread(NULL, 0, ThreadFunc1, 0, 0, 0);
    	CreateThread(NULL, 0, ThreadFunc2, 0, 0, 0);
    	scanf("%c\n",&c);
    }
    

    3)实验结果截图

    展开全文
  • C语言进程——进程间的通信方式

    千次阅读 2018-01-30 19:50:14
    进程间通信就是在不同进程之间传播或交换信息,进程的用户空间是相互独立的,一般而言是不可以互相访问(除共享内存区外),系统空间却是“公众场所”,通过通信方法:管道(pipe)(有名管道FIFO)、消息队列、信号量...

    进程间通信就是在不同进程之间传播或交换信息,进程的用户空间是相互独立的,一般而言是不可以互相访问(除共享内存区外),系统空间却是“公众场所”,通过通信方法:管道(pipe)(有名管道FIFO)、消息队列、信号量(semaphore)、共享内存(shared memory)、套接字(socket)等实现功能。

    进程间通信的主要目的在于:数据传输(管道pipe),共享数据,通知事件,资源共享,进程控制

    管道通信:管道是单向的,先进先出,尾部写入数据,头部读出数据

    无名管道用于父子进程间的通信,有名管道用于同一系统下的兄弟进程间的通信。

    无名管道创建API:int pipe(int filedis[2])(当一个管道建立,会产生两个文件描述符,filedis[0]读管道,filedis[1]写管道)

    有名管道创建API:int mkfifo(const char *pathname,mode_t mode)(pathname:FIFO文件名  mode:属性)

    信号通信:最为古老的进程间通信机制

    常见信号:SIGHUP(来自终端的结束信号) 、SIGINT(来自键盘的中断信号) 、SIGKILL(结束接收信号) 、SIGTERM(kill命令发出的信号) 、SIGCHLD(标识子进程停止或结束) 、SIGSTOP(停止执行信号)【SIGKILL、SIGSTOP绝不可以被忽略】

    信号发送kill、raise、alarm、pause的API:

    int kill(pid_t pid,int signo)
    //kill函数既可向自身发送信号,也可向其他进程发送信号
    int raise(int signo)
    //raise函数是向自身发送信号
    unsigned int alarm(unsigned int seconds)
    /*alarm函数是设置一个闹钟时间
    seconds:经过second秒后会产生信号SIGALRM*/
    int pause(void)
    //该函数是使调用过程挂起直至捕捉到一个信号
    

    信号的处理:
    signal的API:void(*signal(int signum,void(*handler)(int)))(int);
    共享内存
    被多个进程共享的一部分物理内存,共享进程是进程间共享数据的一种最快的方法


    创建API:int shmget(key_t key,int size,int shmflg) 成功返回共享内存标识符,失败返回-1

    映射API:char *shmat(int shmid,char *shmaddr,int flag) 成功返回共享内存映射到进程中的地址,失败返回-1

    消息:

    #include<sys/types.h>
    #include<sys/ipc.h>
    #include<sys/msg.h>
    //消息格式
    struct msgbuf
    {
        long mtype;//消息类型
        char mtext[1];//消息数据的首地址
    };
    
    int msgsnd(int msqid,struct msgbuf *msgp,int msgsz,int msgflg)
    //功能:向消息队列中发送一条消息
    
    int msgrcv(int msqid,struct msgbuf *msgp,int msgsz,long msgtyp,int msgflg)
    //功能:接收消息,从msqid代表的消息队列中读取一个msgtyp类型的消息;成功则返回读出消息的字节数
    
    int msgget(key_t key,int msgflg)
    //key为键值,由ftok获得;msgflg为标志位
    //返回值为与键值key相对应的消息队列描述字
    
    key_t ftok(char *pathname,char proj);
    //将文件名转化为键值
    key: IPC_CREAT、IPC_EXCL、IPC_NOWAIT
    

    总结:

    进程间的通信中关于管道通信时,Linux将不保证写入的原子性(即不保证完整的完成一个进程),只要管道缓冲区有空闲区域,写进程就会试图向管道中写入数据,若读进程不读走缓冲区中的数据,写操作将一直被阻塞。创建无名管道时,父子进程fork()的使用必须在pipe()调用之后。注意:alarm函数使用时,每个进程至多有一个闹钟时间,若以前登记过,且未超时,此时登记新的值,值>0则取代之前的值,值=0则为取消以前的闹钟。



    展开全文
  • c语言访问postgresql有两种方式通过libpq通过ESQL1、通过libpq2、通过ESQL 通过libpq 通过ESQL 1、通过libpq ibpq 是一套允许客户程序向PostgreSQL 服务器服务进程发送查询并且获得查询返回的库函数。 libpq同时也是...

    c语言访问postgresql有两种方式

    1、通过libpq

    ibpq 是一套允许客户程序向PostgreSQL 服务器服务进程发送查询并且获得查询返回的库函数。
    libpq同时也是其他几个PostgreSQL 应用接口下面的引擎,包括 C++,Perl,Python,Tcl 和ECPG。
    c语言调用libpq库,同java使用jdbc原理效果一样。

    使用libpq的必须包括头文件 libpq-fe.h 并且编译的时候 必须加上 -lpq。
    在这里插入图片描述

    直接调用libpq库中函数对postgresql数据库进行操作。
    在这里插入图片描述
    其他函数参考:中文postgresql手册

    运行编译之后程序,需要以下库。注意库版本和服务端版本对应。
    在这里插入图片描述

    2、通过ESQL

    esql嵌入式sql是在c程序中直接使用sql语句。和oracle的proc一样,postgresql提供工具ecpg来编译嵌入式c文件。
    使用时注意使用ecpg和postgresql的服务端版本相同。

    C语言中直接使用SQL语句进行操作,编译时加上-lecpg
    在这里插入图片描述
    运行所需库文件
    在这里插入图片描述

    展开全文
  • pipe() from unistd.h ,sleep() ,write(), read() , fork()管道只能用于具有亲缘关系的进程,可以将其看作一个文件,但有别于普通的文件, 管道一次只可以被一个进程访问,能实现互斥;pipe(int fd[] ), 其参数为...

    最近学习了操作系统的并发;以下是关于进程间实现并发,通信的两个方法。

    1.利用管道进行进程间的通信

    用到下列函数 pipe() from unistd.h ,sleep() ,write(), read() , fork()

    管道只能用于具有亲缘关系的进程,可以将其看作一个文件,但有别于普通的文件, 管道一次只可以被一个进程访问,能实现互斥;pipe(int fd[] ), 其参数为长度为2的int数组,分别代表读端fd[0], 写端fd[1], 在创建管道后,f d[0],fd[1]成为文件描述符;写入(write)管道一端fd[1]的数据,在管道的另一端fd[0]可以被进程读取(read);

    2.利用共享内存实现通信, 信号量实现互斥

    共享内存使用了以下函数:

    int shm_open(const char *name, int oflag, mode_t mode); //创建或打开共享内存, 返回文件描述符

    int ftruncate(int fd, off_t FILE_SIZE); //调整共享内存空间大小

    void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset ) //将文件映射到进程的地址空间,返回指向地址空间的指针

    int munmap(void *start, size_t length); //解除地址映射

    int shm_unlink(const char *name); //删除shm_open()创建的共享内存

    具体思路:

    1. 实现进程间的通信,无非就是各进程间数据的交流,传输;

    - shm_open()函数是创建或打开一个已存在(唯一的name)的共享内存,返回文件描述符,可以看作是创建或打开了一个文件,说法不同而已

    - ftruncate()函数用于指定文件(fd)有多大

    - 关键步骤就是mmap(),它将指定的文件(fd)或其他对象映射到内存, 得到可以直接操作的指针对象,不需调用write, read等

    - 然后就是在使用完成后需要解除映射munmap(), 和删除创建的共享内存(name)shm_unlink(),; 对于做打开共享内存操作的进程,也需要执行这些操作(1,2,3,4.

    2.然后使用信号量实现互斥

    - 互斥的意思为:当一个进程在临界区访问共享资源时,其他进程不能进入该临界区访问任何共享资源

    - 临界区代表进程将访问共享资源的一段代码

    - 当我们在向共享区写入数据时,显然不想多个进程同时访问,因为会造成不必要的麻烦,就需要信号量来实现这种互斥的机制

    sem_t *sem_open(const char *name,int oflag, mode_t mode,unsigned int value) //创建或打开一个存在的(name)信号量

    int sem_wait(sem_t *sem) // 使信号量(value)减1,若信号量小于0,则阻塞执行semwait()的进程

    临界区代码一般存在于这两个调用之间,比如:当前进程向共享区写数据,如受到sem_wait阻塞,表示资源已经用尽或其他进程正在访问,需等待

    int sem_post(sem_t *sem) // 当前进程离开临界区时,使信号量(value)加1

    int sem_unlink(count char *name) //删除信号量

    函数具体用法,可见链接,讲述的很详细了;

    需要注意的是:

    1:在使用共享内存和信号量时要注意,有些调用是使用的共享内存和信号量的name, 但有些是使用的创建或打开他们的返回值(fd和sem_t*)

    2:如在子进程创建之前,父进程已创建了共享内存或信号量,则子进程无需在进行打开操作,可直接使用

    展开全文
  • 如果逻辑控制流在时间上是重叠的,那么它们就是并发的,可以出现在计算机系统的不同层面上,硬件异常处理程序、进程和Unix信号处理程序都是并发的。并发可以看作是操作系统内核用来运行多个应用程序的机制,但是...
  • 共享内存通信方式效率最高,毕竟是直接操作内存,但是要保证多个进程对同一块内存访问的同步互斥比较麻烦,借助信号量实现 对每个共享存储段,内核维护一个shmid_ds类型的结构体,定义在文件中 C代码  struct ...
  • 线程是指进程内的一个执行单元也是...3) 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的资源 4)系统开销: 在创建或撤销进程时,由于系统都要之分配和回收资源,导致系统的开销...
  • 进程 , 多线程 是编写一个多任务程序的相关的机制. 什么是多任务程序呢 ? 一个程序能够同时做多件事情. 比如说:QQ 登录以后同时和多个人聊天还可以上传下载,听音乐 就是多任务. 程序是存放在磁盘上的,那么...
  • 安卓android利用c语言实现其他进程应用app的内存变量读取修改 安卓编译运行环境 已root手机 C4droid + SDL + GCC 中文版下载链接 https://www.lanzous.com/b958367 安装完成后请在设置中以root身份运行 知识学习 /...
  • c语言 管道

    2021-05-27 20:02:32
    在父进程创建无名管道并产生子进程后,父子进程均拥有管道两端的访问权。此时关闭父进程的管道输出端、关闭子进程的管道输入端,就形成一个从父进程到子进程的管道流,数据由父进程写入、从子进程读出。创建从父进程...
  • C语言 pipe

    2019-04-24 21:31:21
    每个进程拥有各自的地址空间,一个进程的全局变量在另一个进程中看不到,所以进程之间不能相互访问,要交换数据必须经过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据...
  • c语言关键字

    2016-09-12 23:41:50
    register 关键字功能: 请求编辑器尽可能地将变量存在cpu内部存储器中,省去抓取数据时间,提高程序运行效率。 修饰寄存器变量:让变量值保持... 进程知道,所以全局变量不能使用register。 ②不能使用取地址获取r
  • 指针 1. 概念  指针就是地址,指向了内存中的一个位置。  地址是内存的一个编号,内存中的一个字节就有一个编号,这个编号就是这个字节的地址。...通过传地址,可以在一个函数中访问另一个函数中的变量。对其进...
  • C语言初始化

    2018-03-17 14:01:00
    比如核心初始化,和内存初始化栈:栈帧:一个进程中一般会有多个函数,每一个函数都需要在内存中开辟一个栈空间来使用,每一个函数所占用栈叫做栈帧。pclrspfp这四个数据。栈帧之空间的界定:fp(栈帧指针)指针用于...
  • C语言随手笔记

    2017-08-23 20:32:00
    C语言随手笔记 link函数创建一个新目录项,并且增加一个链接数。 unlink函数删除目录项,并且减少一个链接数。如果链接数达到0并且没有任何进程打开该文件,该文件内容才被真正删除。如果在...
  • 生产者与消费者问题C语言实现

    万次阅读 多人点赞 2018-05-27 10:51:24
    实验目的 ①实现生产者—消费者问题的模拟,以便更好的理解此经典...缓冲池被占用时,任何进程都不能访问。 ②每一个生产者都要把自己生产的产品放入缓冲池,每个消费者从缓冲池中取走产品消费。在这种情况下,生...
  • C语言的工具

    2009-09-09 13:37:46
    abort:异常终止一个进程abs:求整数的绝对值absread, abswirte:绝对磁盘扇区读、写数据access:确定文件的访问权限acos:反余弦函数allocmem:分配DOS存储段arc:画一弧线asctime:转换日期和时间为ASCII码asin:反正弦函数...
  • 定义互斥信号量mutex,当某个进程访问缓冲区之前先获取此信号量,在对缓冲区的操作完成后再释放此互斥信号量。以此实现多个进程对共享资源的互斥访问。 创建3进程(或者线程)作为生产者,4个进程(或者线程)作为...
  • C语言系统编程

    2017-08-06 20:12:18
    因此,用户进程在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间的函数。 所有执行I/O操作的系统调用使用文件描述符来表示打开的文件。  文件描述符是一个...
  • C语言 共享内存

    千次阅读 2014-03-08 21:32:54
    共享内存指在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问... (shared memory)是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实
  •  32位操作系统支持4GB内存的连续访问,但通常把内存分为两个2GB的空间,每个进程在运行时大可以使用2GB的私有内存(0x00000000—0x7FFFFFFF)。即理论上支持如下的大数组:  char szBuffer[2*1024*1024*1024];...
  • C语言的static的作用

    2019-05-30 11:10:55
    C语言中static的作用如下 第一、在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。且静态局部变量存储于进程的全局数据区,即使函数返回,它...
  • 它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。 这个项目由纯C实现,使用linux系统调用。命令行参数如下: 项目地址:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 645
精华内容 258
关键字:

c语言访问进程

c语言 订阅