linux系统编程
进程,进程间的通信,多线程,网络编程之socket编程
哒宰的自我修养
嵌入式软件工程师,liunx驱动工程师
展开
-
Linux进程通信2:消息队列,共享内存,信号,信号量.(含:综合实例:实现服务器进程和客户进程通信)
消息队列,共享内存,信号量1.消息队列的通信原理:消息队列:是消息的链接表,存放在内核中,一个消息队列由一个标识符(即队列ID)来标识特点:消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取函数原型:#include <sys/msg.h>// 创建或打开消息队列:成功返回队列ID,失败返回-1in原创 2020-10-13 20:52:43 · 1204 阅读 · 3 评论 -
linux进程通信1:进程通信概述,管道通信原理(无名管道,有名管道),管道编程实战
进程通信概述,管道通信原理,管道编程实战1.进程间通信概述:举例1:你手机微信和别人手机微信通信举例2:如:父子进程wait 和 exit之间的通信进程间通信(IPC):指在不同进程之间传播或交换信息进程间通信(IPC)的通信方式:IPC的方式通常有管道(包括无名管道和命名管道),消息队列,信号量,共享存储,socket,streams等,其中socket和streams支持不同主机上的两个进程IPC2. 管道通信原理:管道:通常指无名管道,是UNIX系统IPC最古老的形式原创 2020-10-13 17:41:40 · 697 阅读 · 1 评论 -
Linux进程7:popen函数,pclose函数比system有优点(常用)
popen函数,pclose函数1.popen函数:函数原型: #include “stdio.h” FILE *popen( const char* command, const char* mode )参数说明:command:是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用 -c 标志,shell 将执行这个命令。mode:只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果原创 2020-10-10 16:33:40 · 322 阅读 · 0 评论 -
Linux进程6:system函数,比exec好点(常用)
system函数system函数:Name:System: execute a shell oommand------执行一个shell指令#include <stdlib.h> int system(const char *command);//参数是指针/字符串System()函数的返回值如下:成功,则返回进程的状态值;当sh不能执行时,返回127;失败返回-1;system()函数功能强大,很多人用却对它的原理知之甚少下面是linux版system函数的源码:在原创 2020-10-10 16:08:50 · 177 阅读 · 0 评论 -
Linux进程5:exec族函数(execl, execlp, execle, execv, execvp, execvpe)总结及exec配合fork使用
exec族函数(execl, execlp, execle, execv, execvp, execvpe)exec族函数函数的作用:我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。功能:在调用进程内部执行一个可执行文件,可执行文件既可以是二进制文件,也可以是任何linux下可执行的脚本文件函数族:exec函数族分别是:execl, execl原创 2020-10-10 15:13:55 · 1517 阅读 · 0 评论 -
Linux进程4:孤儿进程,僵尸进程(及解决方法),守护进程讲解
孤儿进程,僵尸进程(及解决方法),守护进程讲解孤儿进程:父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”此时的子进程叫做孤儿进程。====爹没了。Linux避免系统存在过多的孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程。====init养父僵尸进程:创建子进程后,子进程退出状态不被收集,变成僵尸进程。爹不要它了除非爹死后变孤儿init养父接收。如果父进程是死循环,那么该僵尸进程就变成游魂野鬼消耗空间。守护进程:守护进程(Daemon)是在一类脱离终端在后台执行的程序原创 2020-10-10 10:42:10 · 7298 阅读 · 7 评论 -
Linux进程3:父进程等待(wait,waitpid)子进程退出并收集子进程退出状态,僵尸进程
父进程等待子进程退出并收集子进程退出状态1.父进程为什么要等待子进程退出?创建子进程目的:------干活我们要知道干活结束没。子进程退出状态不被收集,变成僵尸进程等待:wait,waitpid函数:#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *status);pid_t waitpid(pid_t pid, int *status, int options);Status参数:是一原创 2020-10-09 12:00:11 · 6054 阅读 · 2 评论 -
linux进程2:进程创建(fork,vfork),fork与vfork的区别,进程退出(exit)
进程创建(fork,vfork),fork与vfork的区别,进程退出(exit)1.使用fork函数创建一个进程:fork函数调用成功,返回两次返回值为0,代表当前进程为子进程返回值为非负数,代表当前进程为父进程调用失败,返回 -1 //pid=fork();#include <unistd.h>Pid_t fork(void);2.获取当前的进程ID号:#include <sys/types.h>#include <unistd.h>pid_原创 2020-10-09 11:09:54 · 200 阅读 · 0 评论 -
Linux进程1:进程概念,查看进程,进程标识符,父进程子进程,空间分配
进程概念,查看进程,进程标识符,父进程子进程,空间分配问1:什么是程序?什么是进程,有什么区别?程序是静态概念,gcc xxx.c -o pro(可执行程序,如:电脑软件)磁盘中生成pro文件,叫做程序进程是程序的一次运动活动,通俗点意思就是程序跑起来了,系统中就多了一个进程问2:如何查看系统中有哪些进程?使用ps指令查看实际工作中,配合grep来查找程序中是否存在某一个进程Ps -aux:查看当前所有进程Ps -aux|grep int:查找特定进程Top:类似windows下原创 2020-10-09 10:29:58 · 923 阅读 · 0 评论 -
网络编程5:socket服务端和客户端代码实现
socket服务端和客户端代码实现客户端代码:#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>//#include <linux/in.h>//与下一行冲突#include <netinet/in.h>#include <arpa/inet.h>#include <stdlib.h>#include <string.h>原创 2020-09-13 22:54:05 · 1074 阅读 · 0 评论 -
网络编程4:Linux提供的API简析(针对Socket服务器和客户端的开发步骤)
Linux提供的API简析(针对Socket服务器和客户端的开发步骤)1.连接协议:(TCP/UDP)//创建套接字int socket(int domain,int type,int protocol);////返回sockfddomain:指明所使用的协议族,通常为AF_INET,表示互联网协议族(TCP/IP协议族);AF_INET IPV4 因特网域AF_INET6 IPV6 因特网域AF_UNIX unix 域AF_ROUTE原创 2020-09-12 22:22:37 · 415 阅读 · 0 评论 -
网络编程3:socket(套接字)编程步骤
socket(套接字)编程步骤打个比方:我是服务器请说汉语------(TCP/UDP)我的IP地址------(楼号)是。。。我的端口号------(房间号)是。。。我在监听哟!(等待大家来访,来了敲门哟!)客户端1获取服务器IP获取服务器端口连接客户端2获取服务器IP获取服务器端口连接客户端3获取服务器IP获取服务器端口连接步骤:1.创建套接字2.为套接字添加信息(IP地址和端口号)3.监听网络连接4.监听到有客户端接入,接受一个连接5.数据交互6.关闭套接字原创 2020-09-12 21:09:45 · 637 阅读 · 0 评论 -
网络编程2:网络编程之字节序
网络编程之字节序1.什么是字节序:字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。2.常见的字节序:A. Little endian:将低序字节存储在起始地址–小端字节序B. Big endian:将高序字节存储在起始地址–大端字节序例子1:在内存中双字0x01020304(DWORD)的存储方式内存地址4000&4001&4002&4003—一个地址对应一个字节LE 04 03 02 01BE 01 02 03 04例子2:如果我们将0x原创 2020-09-12 20:49:46 · 1175 阅读 · 0 评论 -
网络编程1:网络编程概述
网络编程概述进程间通信方式:管道:父子,兄弟进程之间的通信方式消息队列:在内核里面经营一系列的消息队列共享内存:通过内核,创建共享空间信号:A进程通过B进程pid标识符发消息信号量:对临界资源,共享内存进行PUA一些控制特点:依赖于linux内核。造成缺陷:无法多机通信。多机通信:linux与Android,iOS,ARM之间的通信网络中的地址:由IP地址和端口号构成。IP地址是一台设备的唯一标识,端口号识别进程。网络数据交流:协议(数据交流格式):http,tcp,udp原创 2020-09-12 20:30:19 · 119 阅读 · 0 评论 -
线程7:线程条件变量控制实现线程的同步
线程条件变量控制实现线程的同步与条件变量相关API:条件变量是线程另一可用的同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。 条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为必须锁定互斥量以后才能计算条件。 条件变量使用之前必须首先初始化,pthread_cond_t数据类型代表的条件变量可以用两种方式进行初始化,可以把常量PTHREAD_COND_INITI原创 2020-09-12 09:47:46 · 348 阅读 · 0 评论 -
线程6:什么情况造成死锁
什么情况造成死锁1.什么是死锁:由于互斥锁使用不当,导致多个进程无法进行下一步代码的运行。即:两个互斥锁卡住了,以至于其它线程无法使用共享资源2.什么情况造成死锁:前提条件:你有2个锁,当线程A获得一把锁的时候,想要获得另外一把锁,而线程B使用着线程A想要的锁,还想要获得线程A正在使用的锁的时候。参考代码:#include <stdio.h>#include <pthread.h>int g_data=0;//共享资源pthread_mutex_t mutex原创 2020-09-11 22:16:56 · 169 阅读 · 0 评论 -
线程5:互斥锁限制共享资源的访问
互斥锁限制共享资源的访问通过加锁,解锁操作实现限制共享资源的访问:参考案例:让线程t1使用的共享资源g_data数字等于3时,退出线程t1.参考代码:#include <stdio.h>#include <pthread.h>int g_data=0;//共享资源pthread_mutex_t mutex;//创建锁(互斥量)void func1(voidarg)//参数3:调用无类型指针API{ printf(“t1:%l原创 2020-09-11 21:30:14 · 244 阅读 · 0 评论 -
线程4:线程同步之互斥量加锁解锁
线程同步之互斥量加锁解锁与互斥锁相关API: 互斥量(mutex):从本质上来说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为可运行状态的线程可以对互斥量加锁,其他线程将会看到互斥锁依然被锁住,只能回去等待它重新变为可用。在这种方式下,每次只有一个线程可以向前运行。 在设计时需要规定所有的线程必须原创 2020-09-11 20:22:43 · 318 阅读 · 0 评论 -
线程3:线程共享空间的代码验证
线程共享空间的代码验证1.t1,t2两个线程共享空间:参考代码:#include <stdio.h>#include <pthread.h>//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);// 返回:若成功返回0,否则返回错误编号----创建线程void *原创 2020-09-11 19:23:22 · 126 阅读 · 0 评论 -
线程2:线程创建等待及退出
线程创建等待及退出1.Linux上线程开发API概要多线程开发在 Linux 平台上已经有成熟的 pthread 库支持。其涉及的多线程开发的最基本概念主要包含三点:线程,互斥锁,条件。其中,线程操作又分线程的创建,退出,等待 3 种。互斥锁则包括 4 种操作,分别是创建,销毁,加锁和解锁。条件操作有 5 种操作:创建,销毁,触发,广播和等待。其他的一些线程扩展概念,如信号灯等,都可以通过上面的三个基本元素的基本操作封装出来。详细请见下表: 2.与线程自身相关API线程创建:#include原创 2020-09-11 11:56:45 · 1208 阅读 · 0 评论 -
线程1: linux多线程概述(与进程的区别及线程的优势)
Linux多线程概述1.线程概述(与进程的区别及线程的优势)典型的UNIX/Linux进程可以看作只有一个控制线程:一个进程在同一时刻只做一件事,有了多个控制线程后,在程序设计时可以把进程设计成同一时刻做不止一件事,每个线程各自处理独立的任务。2.进程与线程的区别:进程:是程序执行时的一个实例,是担当分配系统资源(CPU时间、内存等)的基本单位。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。原创 2020-09-11 10:25:10 · 275 阅读 · 0 评论