ElfBoard

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
  • 飞凌嵌入式ElfBoard-进程间的通信之信号量
    信号量(semaphore)是进程和线程间控制共享资源访问的重要机制,用于同步操作。与其他进程间通信(IPC)方式不同,信号量本质上是一个计数器,用来跟踪资源的可用数量,并通过增减信号量的值来控制对共享资源的访问权。信号量的值可以理解为资源的数量,信号量为 0 时表示资源已被占用,当信号量为正数时表示资源可用。 1.在 Linux 中,信号量的主要作用 控制共享资源的访问:信号量充当标志,控制对资
  • 飞凌嵌入式ElfBoard-进程间的通信之共享内存
    共享内存是一种高效的 IPC 方法,允许不同的进程在内存中共享数据。通过将一块内存区域映射到多个进程的地址空间,这些进程可以直接读写这块内存,从而实现数据的快速交换。 1.共享内存的特点 高效性:共享内存是所有 IPC 机制中效率最高的,因为它允许多个进程直接访问同一块内存区域,避免了数据复制的开销。 创建与访问:由一个进程创建共享内存段(通常使用 shmget),其他进程通过共享内存标识符来访问
  • 飞凌嵌入式ElfBoard-进程间的通信之信号的发送raise
    raise()函数也是发送信号函数,kill()是向指定pid发送信号,raise()函数则只发送信号给当前进程,而不向其他进程发送信号;raise(sig)等价于kill(getpid(),sig)。 1.头文件 #include <signal.h> 2.函数原型 int raise(int sig); 3.参数 sig:需要发送的信号。 4.返回值 成功时,返回 0。失败时,返回
  • 飞凌嵌入式ElfBoard-进程间的通信之信号的发送kill
    与shell中的 kill 命令相类似,一个进程可通过 kill()向另一个进程发送信号,之所以选择kill作为术语是因为早期的UNIX实现中大多数默认行为是终止进程; 1.头文件 #include <sys/types.h> #include <signal.h> 2.函数原型 int kill(pid_t pid, int sig); 3.参数 pid:用于标识一个或者
  • 飞凌嵌入式ElfBoard-进程间的通信之信号的发送alarm
    alarm()其实是一个配置定时器的函数,当定时器溢出的时候,内核会向进程发送SIGALRM信号。 1.头文件 #include <unistd.h> 2.函数原型 unsigned int alarm(unsigned int seconds); 3.参数 seconds:以秒为单位设置定时时间,如果在seconds秒时间内再次调用了alarm()函数设置了新的闹钟,则会将之前的覆盖
  • 飞凌嵌入式ElfBoard-进程间的通信之匿名管道
    pipe函数用于创建一条匿名管道,在具有亲缘关系的进程(如父子进程)之间进行通信,pipe() 函数会生成一对文件描述符,分别用于管道的读和写操作;由于管道传输是半双工的,数据只能在单个方向上流动,父进程往子进程传数据时,父进程的管道读端和子进程的管道写端都可以先关闭。 1.头文件 #include <unistd.h> 2.函数原型 int pipe(int pipefd[2]);
  • 飞凌嵌入式ElfBoard-进程间的通信之命名管道
    命名管道(FIFO)与匿名管道(PIPE)的不同的地方在于,命名管道在文件系统中具有一个名字,可以使得不相关的进程也能通过该名字访问管道。 在Linux中可以使用mkfifo命令和mknod命令创建命名管道;mkfifo专用于创建命名管道(FIFO)。mknod命令用于创建设备文件,字符设备,块设备或FIFO。 mkfifo 命令非常简单,用法如下: mkfifo <fifo_name&gt
  • 飞凌嵌入式ElfBoard-进程间的通信之信号类型
    信号分为可靠信号和不可靠信号(实时信号与非实时信号),主要区别在于信号的可靠性、排序和丢失情况。 Linux中标准信号(不可靠信号、非实时信号)的编号范围为1~31,这前面31个信号都有特殊的名字,有着相对应的特殊事件;Linux的信号机制是从UNIX系统中继承过来的,但是早期UNIX 系统中的信号机制比较简单和原始,后来逐渐暴露出来了一些问题,这些不可靠信号不支持排队(处理信号的时候又来了新的信
  • 飞凌嵌入式ElfBoard-进程间的通信
    进程间通信(interprocess communication,简称 IPC)是指在操作系统中,不同进程之间的数据交换和消息传递的方式。IPC提供了多种机制来实现此功能,进程间通信包含信号、管道、消息队列、信号量、共享内存、和套接字等方式,每种机制适用于不同的场景。 ⚫信号:可以异步通信,并且具有轻量级的特点,但是不能传递复杂的数据,只能携带少量信息。 ⚫管道:普通管道只能在父子进程之间单向通信
  • 飞凌嵌入式ElfBoard-进程间的通信之信号处理sigaction
    sigaction()函数可以设置各种属性在调用信号处理器程序时的行为,并且还允许在获取信号进行处理的同时不改变信号 1.头文件 #include <signal.h> 2.函数原型 int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 3.参数 signum:参数指定需要捕获
  • 飞凌嵌入式ElfBoard-进程间的通信之信号处理signal
    signal()主要是用于捕获信号,改变进程中对信号的默认行为。信号的处理是异步的,也就是说,不论程序当前正在执行什么代码,当信号到达时,信号处理函数都会立即执行。 1.头文件 #include <signal.h> 2.函数原型 typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_
  • 飞凌嵌入式ElfBoard-进程间的通信之信号处理pause
    pause()可以让进程暂停运行,当进程被挂起时,它不会占用 CPU 资源,直到某个信号(如 SIGINT 或 SIGTERM)被发送给该进程。 1.头文件 #include <unistd.h> 2.函数原型 int pause(void); 3.参数 无。 4.返回值 pause() 在成功时不会返回。进程接收到信号并恢复执行,pause() 将返回 -1,并设置 errno为 E
  • 飞凌嵌入式ElfBoard-进程的基本操作之进程等待wait
    wait()函数可以获取子进程的退出状态。当父进程调用 wait() 时,它会阻塞,直到其中一个子进程终止。此时,终止的子进程的退出状态会被返回给父进程,父进程可以通过提供的状态参数来检查子进程是正常退出还是异常终止。 1.头文件 #include <sys/types.h> #include <sys/wait.h> 2.函数原型 pid_t wait(int *wsta
  • 飞凌嵌入式ElfBoard-进程的基本操作之进程等待waitpid
    waitpid()提供了更灵活的选项,允许父进程等待特定的子进程终止,或非阻塞地查询子进程状态,进一步增强了进程管理的灵活性。比如可以指定等待某个pid的子进程、提供一个非阻塞版本的wait()功能等,这对处理多个子进程的情况更加友好。 1.头文件 #include <sys/types.h> #include <sys/wait.h> 2.函数原型 pid_t waitp
  • 飞凌嵌入式ElfBoard-进程的基本操作之进程终止exit
    exit() 函数用于终止一个进程,并返回一个状态码给操作系统。这是标准C库中的函数,用于在进程完成任务后退出,释放资源并将控制权返回给操作系统内核。它的定义在 stdlib.h 中。 1.头文件 #include <stdlib.h> 2.函数原型 void exit(int status); 3.参数 status: 整型参数,表示进程退出时的状态码,通常用来告知操作系统或父进程当
  • 飞凌嵌入式ElfBoard-进程的基本操作之进程终止atexit
    atexit() 函数用于注册一个程序在正常终止时会自动调用的函数。通过这个函数,确保在程序结束时执行一些必要的清理工作,例如关闭文件、释放内存等。 1.头文件 #include <stdlib.h> 2.函数原型 int atexit(void (*function)(void)); 3.参数 function:是一个没有参数、没有返回值的函数指针。该函数会在 exit() 被调用时
  • 飞凌嵌入式ElfBoard-进程之优先级和调度类
    进程调度是操作系统中相当重要的一部分,Linux是多任务的操作系统,进程无法始终占有CPU运行;对于单处理器系统来说,事实上多个进程仅仅是轮流在自己的时间片使用CPU资源;只有在多处理器系统中,多个进程才有可能真正的做到同时、并行的执行。 多任务系统也分为非抢占式多任务和抢占式多任务系统;在非抢占式多任务的系统中,下一个任务被调度的前提是当前进程主动让出CPU的使用权,因此非抢占式多任务又称为合作
  • 飞凌嵌入式ElfBoard-进程之进程的内存布局
    逻辑上可以将一个进程划分为以下几个部分; ⚫文本:包含主函数和其他函数的机器指令。具有只读性,防止程序在运行时意外修改自己的指令;可共享,多个进程可以共享同一段代码,节省内存资源。 ⚫初始化数据段:存放显式初始化的全局变量和静态变量。当程序加载时,这些变量的初始值会从可执行文件中读取。 ⚫未初始化数据段 (BSS段):存放未显式初始化的全局变量和静态变量。系统在程序启动时会将这部分内存初始化为0。
  • 飞凌嵌入式ElfBoard-进程的基本操作之创建执行进程system
    在Linux中启动一个进程有多种方法,比如可以使用system()函数,但是在使用之前应先考虑一下;因为system()效率低,每次调用 system() 都会启动一个新的shell进程,这样会增加开销。而且具有安全风险,如果传递的命令包含用户输入,可能会导致安全漏洞;环境变量和路径问题也可能会影响命令的执行。目前多数使用fork()函数去创建一个新的进程,这个方法相对复杂了很多,但是效率高;可以
  • 飞凌嵌入式ElfBoard-进程的基本操作之创建执行进程fork
    fork()会创建一个新的子进程,该子进程是调用进程(父进程)的一个副本。新的进程与原进程共享相同的代码,但它们拥有独立的地址空间和资源。 1.头文件 #include <sys/types.h> #include <unistd.h> 2.函数原型 pid_t fork(void); 3.参数 无。 4.返回值 成功创建子进程:在父进程中:返回子进程的 PID(进程 ID

正在努力加载...