
IPC
zxy131072
嵌入式linux
展开
-
Linux C 中popen函数使用
#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h> #include <stdio.h> /** FILE *popen(const char *command, const char *type); ** int pclose(FILE *stream); ** 功能:* 以创建管道的方式启动一个原创 2020-09-09 11:00:42 · 1095 阅读 · 0 评论 -
fork函数调用后缓冲区的刷新
以下程序创建一个子进程,打印各自的pid和ppid号, puts(“Begin---------------”);只会打印1次。#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <string.h> int main(int argc, const原创 2020-09-03 17:03:14 · 249 阅读 · 0 评论 -
exit与_exit函数的比较
_exit()执行后会立即返回,而exit()要先执行一些清除操作,比如刷新缓冲区,然后将控制权交给内核。调用_exit()函数时,会关闭进程所有的文件描述符,清理内存,以及其他一些内核清理函数,但不会刷新流(stdin 、stdout、stderr……)。exit()函数是在_exit()函数上的一个封装,它会调用_exit,并在调用之前先刷新流。exit()函数与_exit()函数最大的区别就在于,exit()函数在调用exit系统之前要检查文件的打开情况,把文件缓冲区的内容写回文件。代码测试#原创 2020-08-27 13:49:29 · 371 阅读 · 0 评论 -
Linux下进程基础
程序:由数据和指令组成,是静态的,一般存在于磁盘中,当装载进内存后可被执行。进程:是正在执行的程序,是动态的,在计算机内存中,包括程序的指令、数据以及程序运行需要的栈、堆、打开的文件等一切资源。进程的状态:运行态、可中断睡眠态、不可中断睡眠态、停止态、僵尸态、死亡态。进程的数据空间:常量区、静态区、堆区、栈区。Linux采用虚拟内存机制来管理系统内存,每个进程的地址空间都是虚拟的,通过内存映射表对应物理内存。段错误是操作系统的一种保护机制,当进程遇到了不可恢复的访存错误时,内核发出信号将该原创 2020-08-19 13:25:40 · 108 阅读 · 0 评论 -
使用线程的互斥锁实现生产者消费者模型
#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <unistd.h>#include <sys/syscall.h>#define PTHREAD_NUM 2typedef void *(*pthread_func_t)(void *);原创 2020-08-20 13:38:59 · 217 阅读 · 0 评论 -
使用互斥锁实现字符串的逆置
#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/syscall.h>#include <unistd.h>typedef void *(*pthread_func_t) (void *);pthread_mutex_t mutex;char buf[] = "hello world";原创 2020-08-20 13:17:15 · 225 阅读 · 0 评论 -
互斥锁与条件变量实现按照顺序打印ABC
#include <stdio.h>#include <unistd.h>#include <pthread.h>#include <semaphore.h>#define PTHREAD_NUM 3void *print_a(void *);void *print_b(void *);void *print_c(void *);typedef void *(*pthread_func_t)(void *);struct abc_de原创 2020-08-20 12:06:09 · 356 阅读 · 0 评论 -
使用三个线程下的信号量实现顺序打印ABC
#include <stdio.h>#include <unistd.h>#include <pthread.h>#include <semaphore.h>#define PTHREAD_NUM 3void * print_a(void *);void * print_b(void *);void * print_c(void *);typedef void *(*pthread_func_t)(void *);typedef st原创 2020-08-20 10:53:29 · 493 阅读 · 0 评论 -
C中消息队列
mymsg.h#ifndef __MYMSG_H__#define __MYMSG_H__#define N 32struct mydata{ int a; int b;};struct msgbuf{ long mtype; /* message type, must be > 0 */ char mtext[sizeof(struct mydata)]; /* message data */};#endifmsg_snd.c#inc原创 2020-08-12 09:15:13 · 567 阅读 · 0 评论 -
C共享内存读写结构体中的内容
myshm.h#ifndef __MYSHM_H__#define __MYSHM_H__#define N (1)#define PAGESIZE (4096)struct mydata{ int a; int b;};#endifshm_write.c#include <stdio.h>#include <sys/ipc.h>#include <sys/shm.h>#include <string.h>原创 2020-08-12 00:01:44 · 1562 阅读 · 0 评论 -
IPC中无名管道pipe
基本使用#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(int argc, const char *argv[]){ //创建一个无名管道 int fd[2]; if(pipe(fd) < 0) { perror("fail to pipe"); exit(1); } printf("fd[0] = %d\n", fd[0]); //3 pri原创 2020-08-11 08:48:25 · 248 阅读 · 0 评论 -
linux下信号
信号特点1、简单2、 携带的信息量少3、 使用在某个特定的场景中信号的状态1、 产生2、未决状态 - 没有被处理3、 递达 - 信号被处理了相关函数kill – 发送信号给指定进程函数原型: int kill(pid_t pid, int sig);raise – 自己给自己发信号 kill(getpid(), sigkill); 函数原型: int rais...原创 2019-04-26 17:40:54 · 396 阅读 · 0 评论 -
进程综合测试案例
实现目标1、创建3个子进程。2、子进程1执行pwd的命令,子进程2执行当前目录下的额一个段错误的ELF文件,子进程3执行ps命令。3、使用execl、execlp等函数实现。测试源码#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>...原创 2019-04-24 20:31:21 · 198 阅读 · 0 评论 -
父子进程实现进程间读写通信
需求1、父进程写一段话,子进程将这段话读走并打印。2、使用fork、read、write函数实现。测试代码#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include ...原创 2019-04-24 20:31:36 · 1792 阅读 · 0 评论 -
进程间通信之匿名管道pipe
IPC基本概念进程间通信:InterProcess Communication进程间通信常用的4种方式a. 管道 - 简单b. 信号 - 系统开销小c. 共享映射区 - (有无血缘关系的进程间通信都可以)d.本地套接字 - 稳定e.消息队列管道的概念本质1、内核缓冲区2、伪文件 - 不占用磁盘空间特点1、读端,写端,对应两个文件描述符数据写端流入, 读端流出2、操作管...原创 2019-04-25 17:39:24 · 257 阅读 · 0 评论 -
父子进程间通信,实现ps aux | grep bash功能
测试源码#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <string.h>int main(int argc, const char* ar...原创 2019-04-25 17:38:54 · 581 阅读 · 0 评论 -
兄弟进程间通信, 实现ps aux | grep bash功能
测试源码#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <string.h>#include <sys/wait.h>int ma...原创 2019-04-25 17:38:01 · 699 阅读 · 0 评论 -
fpathconf函数介绍
函数原型 #include <unistd.h> long fpathconf(int fd, int name);功能:对文件的相关参数进行配置。参数:fd:打开的文件描述符name:在下面进行选择_PC_LINK_MAXThe maximum number of links to the file. If fd or path r...原创 2019-04-25 17:39:11 · 828 阅读 · 0 评论 -
使用fifo进行无血缘关系的进程间通信
fifo特点有名管道在磁盘上有这样一个文件 ls -l -> p伪文件,在磁盘大小永远为0在内核中有一个对应的缓冲区半双工的通信方式使用场景 没有血缘关系的进程间通信创建方式 命令:mkfifo 管道名 函数:mkfifofifo文件可以使用IO函数进行操作 open/close read/write 不能执行lseek操作使用fifo进行无...原创 2019-04-25 17:39:41 · 942 阅读 · 0 评论 -
内存映射区mmap函数
mmap - 创建内存映射作用: 将磁盘文件的数据映射到内存, 用户通过修改内存就能修改磁盘文件函数原型void *mmap(void *adrr, // 映射区首地址,传NULLsize_t length, // 映射区的大小® 100byte - 4k® 不能为0® 一般文件多大,length就指定多大int prot, // 映射区权限PROT_READ – ...原创 2019-04-25 17:40:00 · 430 阅读 · 0 评论 -
孤儿进程
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wai...原创 2019-04-24 20:30:59 · 256 阅读 · 0 评论 -
僵尸进程
产生原因当子进程退出时,父进程没有调用wait函数或者waitpid()函数等待子进程结束,又没有显式忽略SIGCHLD信号,那么它将一直保持在僵尸状态,如果这时父进程结束了,init进程会自动接收这个子进程,为它收尸,但如果父进程是一个循环,不会结束,那么子进程就会一直保持僵死状态。测试代码#include <stdio.h>#include <unistd.h>...原创 2019-04-24 20:30:36 · 173 阅读 · 0 评论 -
哲学家就餐模型
哲学家就餐模型五个哲学家, 围着一张桌子吃饭,每个哲学家只有一根筷子, 需要使用旁边人的筷子才能把饭吃到嘴里,抢到筷子的吃饭, 没抢到的思考人生。多线程实现哲学家交替吃饭模型测试源码#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>...原创 2019-04-28 17:44:52 · 663 阅读 · 0 评论 -
exec函数族的综合测试代码
exec函数族用来在程序中执行另外的进程,配合fork函数,用来分别执行不同的进程,在某些场合还是比较实用的。下面的测试代码涵盖了exec函数族的所有函数,均给了测试代码和比较详细的解释,实用函数传参的方式,可以在一个源文件下测试这些函数。执行 ./exec 1-6即可。测试参考源码:#include <stdio.h>#include <stdlib.h>#i...原创 2019-04-23 15:31:48 · 190 阅读 · 0 评论 -
ubuntu或者mint下安装线程man手册
由于线程的相关函数是在第三方库中的,原始的linux系统没有全部安装这部分的man手册,需要自己再额外安装。sudo apt install -y manpages-posix-dev没有安装前查询pthread_nutex_init安装安装完成后再次查询完成安装...原创 2019-04-27 11:53:42 · 459 阅读 · 0 评论 -
信号集
信号集操作相关函数概念未决信号集没有被当前进程处理的信号阻塞信号集将某个信号放到阻塞信号集,这个信号就不会被进程处理阻塞解除之后,信号被处理自定义信号集相关函数int sigemptyset(sigset_t *set); 将set集合置空int sigfillset(sigset_t *set); 将所有信号加入set集合int sigaddset(sigset_t *s...原创 2019-04-26 17:49:35 · 524 阅读 · 0 评论 -
测试电脑1s能数多少个数字?
目标使用alarm测试自己的系统1s中可以数多少数字。alarm函数的使用测试源码#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <string.h...原创 2019-04-26 17:45:34 · 511 阅读 · 0 评论 -
使用mmap函数实现两个进程间读写通信
目的有一个进程负责写内容到mmap映射的一块缓存区中,另一个进程负责将这些内容读取出来。测试源码1、mmap_r_ipc.c源码#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/types.h>...原创 2019-04-26 17:31:49 · 1414 阅读 · 0 评论 -
linux下使用mmap创建匿名管道实现进程间通信
测试源码#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/mman.h>#include <fcntl.h>#include &...原创 2019-04-26 17:27:15 · 238 阅读 · 0 评论 -
exec函数族
一、相关函数 1、 int execl(const char *path, const char *arg, ...); 函数描述:加载一个进程,通过路径 + 程序名来加载。 函数参数: path:程序路径+程序名字,要执行的程序的绝对路径 arg:可执行程序的相关参数,使用NULL结尾 第一arg:占位,后边的arg: 命令的参数...原创 2019-04-18 11:21:04 · 186 阅读 · 0 评论 -
循环创建多个子进程
一、相关函数1、创建子进程 pid_t fork(void); 返回值: 成功: 对于父进程来说返回子进程ID 对于子进程来说返回值为0 失败: 如果为-1表示创建失败 2、获取当前进程ID pid_t getpid(void); 返回值:当前进程ID 3、获取当前进程的父进程ID pid_t getppid(void)...原创 2019-04-18 11:20:47 · 1234 阅读 · 0 评论 -
Linux中的守护进程
守护进程守护进程的特点后台服务进程独立于控制终端周期性执行某任务不受用户登录注销影响一般采用以d结尾的名字(服务)进程组进程的组长:组里边的第一进程进程组的ID == 进程组的组长的ID进程组组长的选则:进程中的第一个进程进程组ID的设定:进程组的id就是组长的进程ID会话:多个进程组创建一个会话注意事项1、不能是进程组长2、创建会话的进程成为新进程组的组长3、创建...原创 2019-04-28 17:01:45 · 319 阅读 · 0 评论 -
线程创建与线程退出
线程相关概念察看指定线程的LWP号线程号和线程ID是有区别的线程号是给内核看的查看方式:找到程序的进程IDps Lf pid线程相关函数创建线程 – pthread_create int pthread_create( pthread_t *thread, // 线程ID=无符号长整型 const pthread_attr_t *attr, // 线程属性, NUL...原创 2019-04-28 17:35:44 · 666 阅读 · 0 评论 -
信号量semaphore
信号量头文件 - semaphore.h信号量类型 sem_t sem;------》本质int相关函数初始化信号量sem_init(sem_t *sem, int pshared, unsigned int value);参数:pshared:0 - 线程同步;1 - 进程同步。value:最多有几个线程操作共享数据销毁信号量sem_destroy(sem_t *se...原创 2019-04-28 17:44:44 · 517 阅读 · 0 评论 -
条件变量pthread_cond_t
条件变量条件变量是锁吗?不是锁, 但是条件变量能够阻塞线程------》使用条件变量 + 互斥量互斥量: 保护一块共享数据条件变量: 引起阻塞生产者和消费者模型条件不满, 阻塞线程当条件满足, 通知阻塞的线程开始工作。条件变量的类型: pthread_cond_t;相关函数初始化一个条件变量pthread_cond_init( pthread_cond_t...原创 2019-04-28 17:44:28 · 1698 阅读 · 0 评论 -
读写锁
读写锁读写锁是一把锁读写锁的类型锁读操作锁写操作不加锁读写锁的特性1、线程A加读锁成功, 又来了三个线程, 做读操作, 可以加锁成功-------》加读锁, 可以并行2、线程A加写锁成功, 又来了三个线程, 做读操作, 三个线程阻塞-------》写操作的时候不能读, 写的时候是串行的3、线程A加读锁成功, 又来了B线程加写锁阻塞, 又来了C线程加读锁阻塞-------》写的优先...原创 2019-04-28 17:43:08 · 270 阅读 · 0 评论 -
互斥锁操作 pthread_mutex_t mutex
互斥锁创建一把锁:pthread_mutex_t mutex;使用互斥锁缺点?串行互斥锁的使用步骤1、创建互斥锁: pthread_mutex_t mutex;2、初始化: pthread_mutex_init(&mutex, NULL);3、找到线程共同操作的共享数据4、加锁: pthread_mutex_lock(&mutex); // 阻塞线程pthread...原创 2019-04-28 17:41:18 · 1620 阅读 · 0 评论 -
进程waitpid函数
函数原型pid_t waitpid(pid_t pid, int *status, in options); 作用:回收子进程 参数: ① pid: pid == -1 等待任一子进程。与wait等效。 pid > 0 等待其进程ID与pid相等的子进程。 id == 0 等待其组ID等于调用进程的组I D的任一子进程 pid < -1 等待其组ID等...原创 2019-04-23 17:46:48 · 422 阅读 · 0 评论 -
进程中的wait函数
函数原型pid_t wait(int *status); 函数作用: ① 阻塞并等待子进程退出 ② 回收子进程残留资源 ③ 获取子进程结束状态(退出原因) 返回值: 成功:清理掉的子进程ID 失败:-1 (没有子进程) 参数:子进程的退出状态 -- 传出参数 1. WIFEXITED(status):为非0 → 进程正常结束 WEXITSTATUS...原创 2019-04-23 17:33:14 · 2647 阅读 · 0 评论 -
循环创建多个子线程
测试源码#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <string.h>#include <pthread.h>void* m...原创 2019-04-28 17:36:23 · 356 阅读 · 0 评论