Linux开发--进程

Linux中的特殊进程:idle进程(0号进程)、init进程(1号进程,被systemd 取代 )、kthreadd进程(2号进程) kthreadd线程是内核空间其他内核线程的直接或间接父进程,PID为2;idle进程是init进程和kthreadd进程(内核线程)的父进程;init进程是Linux中第一个用户空间的进程,PID为1;该进程是Linux中的第一个进程(线程),PID为0;init进程是其他用户空间进程的直接或间接父进程;kthreadd线程负责内核线程的创建工作; 阅读详情

经典五问:

1.什么是程序?什么是进程?

从是否运行进行判断: 
gcc xxx -o pro,磁盘中生成的pro文件,就是程序
进程是程序一次运行活动

程序是静态的概念,进程是动态的概念。


2.如何查看系统中的进程:

在linux中

a.使用ps(-aux) 命令查看,使用 grep命令过滤
例如: ps -aux | grep init

b. top 指令,类似window的任务管理器

3.什么是进程标识符:


每一个进程 都有一个非负整数 表示唯一ID,叫 pid
pid=0,称为交换进程(swapper),作用--进程调度
pid=1,init进程,作用 -- 系统初始化

调用getpid() 函数获取自身的进程id

getppid() -- 获取父进程id


#include <sys/types.h>
#include <unistd.h>

int main()
{
 pid_t pid;
 pid = getpid();
 printf("pid == %d\n",pid);
 while(1);
    return 0;
}

4. 什么叫父进程?什么叫子进程?


if 进程A创建了进程B,那么A是B 的父进程,B是A的子进程。

5.C程序存储空间是如何分配?


高地址 ------------------------> 低地址

命令行参数和环境变量-----> 栈(函数里的形参  和 局部变量) -------> 堆(malloc等动态内存函数申请的内存空间) ------------>未初始化的数据(BSS段 int a;) -------->初始化的数据(数据段 int b=10;)----->正文(代码段)

int a = 0; //全局初始化区 
char *p1; //全局未初始化区 
void main() 
{
    int b; //栈 
    char s[] = “abc“;//栈 
    char *p2; //栈 
    char *p3 = “123456“; //123456\0在常量区,p3在栈上;体会与 char s[]="abc"; 的不同
    static int c =0; //全局初始化区 
    p2 = (char *)malloc(20); //堆区
    strcpy(p1, “123456“); //123456\0在常量区,编译器可能将它与p3指向的 “123456 “优化成一块
}

参考自:什么变量存放在栈和堆_什么样的数据进堆 什么样的数据进栈-优快云博客


===================================================

fork函数


进程函数 fork 使用:


头文件:
       #include <sys/types.h>
       #include <unistd.h>
函数原型:
       pid_t fork(void);
返回值:

 调用成功,调用一次,返回两次:  
0--代表当前进程是子进程
非负数 -- 代表是父进程

调用失败,放回-1

--------------------------------------

fork_case:


case1 : 证明fork() 之后的语句,父子进程都会执行,fork之前的语句只有父进程执行

#include <sys/types.h>
#include <unistd.h>

int main()
{
 pid_t pid1;
 pid_t pid2;
 pid1 = getpid();
 printf("Before fork,pid=%d\n",pid1);
 fork(); //创建一个进程
 pid2 = getpid();
 printf("After fork,pid=%d\n",pid2);
 if(pid1 == getpid()){
 printf("This is father print. fatherPid=%d\n",pid1);
 }
 else {
 printf("This is child print. childPid=%d\n",pid2);
 }

    return 0;
}

--------------------------------


case2:验证: fork 返回值,fork调用一次,返回两次,>0 父进程, ==0子进程


#include <sys/types.h>
#include <unistd.h>

int main()
{
pid_t pid;
pid=getpid();
printf("father pid =%d\n",pid);
pid=fork();
if(pid>0){//父进程
printf("This is father print,pid=%d\n",getpid());

}
else if(pid == 0){ //子进程
printf("This is child print,pid=%d\n",getpid());

}

    return 0;
}

----------------------------


case3:  探索fork 父进程返回大于0的数有什么意义

等于子进程Pid号,子进程返回值就是0


//why给返回0的;理由:pid=0被交换进程所占用,不可能作为他的pid


#include <sys/types.h>
#include <unistd.h>

int main()
{
pid_t pid;
pid_t pid2;
pid_t retpid;
pid=getpid();
printf("father pid =%d\n",pid);
retpid=fork();
pid2=getpid();
if(pid==pid2){//父进程
printf("This is father print,retpid=%d,  pid=%d\n",retpid,pid2);

}
else { //子进程
printf("This is child print,retpid=%d,  pid=%d\n",retpid,pid2);

}

    return 0;
}


=============================================================


fork创建进程发生了什么?

 进程早期设计的时候把,全拷贝--内存-空间所有内容都进行了拷贝
后面写时拷贝(不变的内容放在共享空间,不拷贝)只对copy on write- COW- 子进程 修改的内存进行单独拷贝

执行 fork 以后: fork之后的代码会被直接拷贝下来,给父子进程调度使用,
父子进程的变量独立,子进程改变自己的变量,父进程不受影响(因为子进程实际拷贝了一份单独的内存空间,和父进程独立)


case:父子进程内存空间独立


#include <sys/types.h>
#include <unistd.h>

int main()
{
pid_t pid;
pid_t pid2;
int a=88;
pid=getpid();
printf("father pid =%d\n",pid);
fork();
pid2=getpid();
if(pid==pid2){//父进程
printf("This is father print,  pid=%d\n",pid2);

}
else { //子进程
printf("This is child print, pid=%d\n",pid2);
a+=12;
}
printf("a=%d\n",a);

    return 0;
}


============================


fork 创建子进程的目的:

1)父进程希望复制自己,使父子进程同时执行不同的代码段。 -- 常见于网络服务

2)一个进程要执行一个不同的程序。这在shell中常见,这种情况下,子进程从fork返回后,立即调用exec()


case:模拟网络服务(1)


#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    pid_t pid;
    pid_t pid2;
    int data = 0;
    while (1)
    {
        printf("please input a data\n");
        scanf("%d", &data);
        if (data == 1)
        {
            pid = fork(); // 每次近来创建一个子进程

            if (pid > 0)
            { // 父进程
            }
            else
            { // 子进程
                while (1)
                {
                    printf("net request,pid=%d\n", getpid());
                    sleep(10);
                }
            }
        }

        else
        {
            puts("waitting,do noting");
        }
    }

    return 0;
}


 

==========================================


vfork()函数

vfork 和fork的区别:


1.vfork是直接使用父进程的存储空间,不拷贝
2.vfork保证子进程先运行,当子进程调用exit()后,父进程才执行

case 区别验证:

#include <sys/types.h>
#include <unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
    pid_t pid;
    int cnt=0;
    pid = vfork();
    if (pid > 0)
    {
        while (1)
        {
            printf("cnt = %d\n",cnt);
            printf("this is father pid=%d\n", getpid());
            sleep(1);
        }
    }
    else
    {
        while (1)
        {
            printf("this is child pid=%d\n", getpid());
            sleep(1);
            cnt++;
            if(cnt==5){
            exit(0);
            }
        }
    }

    return 0;
}

=======================================


进程退出:

正常退出:


1.Main 函数return
2.进行调用exit(),标准C库
3.进程调用_exit() 或者_Exit(),属于系统调用

补充:(一个进程包含多个线程,当最后一个线程结束的时候进程就退出了)
1.进程最后一个线程放回
2.最后一个线程调用 pthread_exit


异常退出:


1.调用 abort
2.当进程接收到接收信号,如 ctrl+c
3.最后一个线程对取消(cancellation)请求做出响应

//无论进程如何退出最后都会执行内核的同一段代码,这段代码为所有相关进程关闭所有打开描述符,释放他的所有存储器

子进程调用exit _exit _Exit 的时候父进程可以调用waitpid 查看子进程退出的状态

推荐
exit() 是对_exit() _Exit()的封装,先处理缓冲区,再退出

=====================================


等待子进程退出:wait()


收集退出状态:

why?
创建子进程目的:
子进程退出状态if不被收集会变成僵尸进程


通过ps可以发现他的状态Z+ --僵尸进程,父进程--S+运行中


       #include <sys/types.h>
       #include <sys/wait.h>

       pid_t wait(int *wstatus);

       pid_t waitpid(pid_t pid, int *wstatus, int options);

       int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);

status参数:
是一个整形数值指针
非空: 子进程退出状态 放在他所指向的地址中
空: 不关心退出状态

检测wait和waitpid所放回终止状态的宏:


WEXITSTATUS(status); -- 正常退出
WIFSIGNALED(status) --异常退出
WIFSTOPPED(status) -- 暂停子进程的返回状态
WIFCONTINUED(status) -- 暂停好继续 的子进程放回的状态

wait下的父进程:
- 如果所有子进程都还在进行,则阻塞
-一个子进程已经终止,正等待父进程获取其终止状态,则该子进程终止状态立刻返回
-如果父进程没有终止子进程,则出错返回

wait 和 waitpid 区别:


wait使调用者阻塞,waitpid有一个选项,可以使得调用者不阻塞

当option = WBOHANG 的时候  不阻塞

====================================


孤儿进程:

概念
父进程先于子进程退出,使得子进程变成孤儿进程

linux系统为了避免出现过多的孤儿进程,init进程来收留孤儿进程,init进程就是孤儿进程的父进程

验证程序:

#include <sys/types.h>
#include <unistd.h>
#include<stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include<stdlib.h>
int main()
{
    pid_t pid;
    int cnt=0;
    int status=10;
    pid = fork();
    if (pid > 0)
    {

            printf("this is father pid=%d\n", getpid());
      
    }
    else if(pid==0)
    {
        while (1)
        {
            printf("this is child pid=%d\t my father ppid=%d\n", getpid(),getppid());
            sleep(1);
            cnt++;
            if(cnt==3){
            exit(3);
            }
        }
    }

    return 0;
}

=====================================================


exec族函数:


但一个进程跑到一半的时候,调用exec族函数去执行另一个程序.

exec函数族:
execl
,execlp, execv,execvp   ,execle ,execvpe(e结尾不常用)

返回值:
exec成功不会放回,失败设置error并返回 -1,然后从原程序调用点往下执行

参数说明:
path:可执行文件路径
arg:可执行程序所带参数,第一个参数是程序名,没有带路径且arg必须以NULL结束
file: 如果参数中包含/,则视为路径,否则就按PATH环境变量,在他所在目录中搜寻可执行文件


perror -- 打印出错误信息;
perror(why);  why: 错误信息

execl例子:


#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
printf("before execl\n");
if(execl("./echo","echo","abc",NULL)==-1){
puts("execl error!!!");
perror("why");
}
puts("after execl");
    return 0;
}


#include<stdio.h>

int main(int argc,char **argv)
{
int i;
for(i=0;i<argc;++i){
printf("argv[%d]=%s\n",i,argv[i]);

}
    return 0;
}

gcc echoarg.c -o echo


-------------------------------------------

execl("/bin/ls","ls","-l",NULL)  -- 第一个参数直接写绝对路径,调用系统的命令

execl("/bin/date","date",NULL)==-1) -- 获取系统时间


execlp -- p 通过系统环境变量找到指令,不用写绝对路径了
such as:  execlp("ps","ps",NULL,NULL)==-1)

v -- 使用指针char * [](字符串数组-二维数组)代替参数


#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
printf("before execl\n");
char *argv[]={"ps",NULL,NULL};
if(execvp("ps",argv)==-1){
puts("execl error!!!");

}
puts("after execl");
    return 0;
}



exec 配合 fork使用:


case1: 实现功能,当父进程检测到输入为1 的时候,创建子进程吧配置文件的字段修改掉

=============
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    pid_t pid;
    pid_t pid2;
    int data = 0;
    while (1)
    {
        printf("please input a data\n");
        scanf("%d", &data);
        if (data == 1)
        {
            pid = fork(); // 每次近来创建一个子进程

            if (pid == 0)
            { // 子进程
                int fdSrc;

                char *readBuf = NULL;
                fdSrc = open("./config.txt", O_RDWR);
                int size = lseek(fdSrc, 0, SEEK_END);
                lseek(fdSrc, 0, SEEK_SET);

                readBuf = (char *)malloc(sizeof(char) * (size + 8));
                int n_read = read(fdSrc, readBuf, size);
                char *p = strstr(readBuf, "LENG=");
                if (p == NULL)
                {
                    puts("not found");
                    exit(-1);
                }
                p = p + strlen("LENG=");
                *p = '5';
                lseek(fdSrc,0,SEEK_SET);

                write(fdSrc,readBuf,strlen(readBuf));
                close(fdSrc);

            }
        }

        else
        {
            puts("waitting,do noting");
        }
    }

    return 0;
}


----------------------
 

execl进行优化:

#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>

int main()
{
    pid_t pid;
    pid_t pid2;
    int data = 0;
    while (1)
    {
        printf("please input a data\n");
        scanf("%d", &data);
        if (data == 1)
        {
            pid = fork(); // 每次近来创建一个子进程
            if(pid>0){
                wait(NULL);//防止变成】僵尸进程
            }
            else if (pid == 0)
            { // 子进程
               execl("./changedata","changedata",NULL);
              
            }
        }

        else
        {
            puts("waitting,do noting");
        }
    }

    return 0;
}


=================================


system进行优化:


       #include <stdlib.h>

       int system(const char *command);


system -- 封装后的exec

调用/bin/sh失败返回127 其他失败返回-1

与exec 的区别,执行完后还会回去执行原程序的代码
=============================
一句system调用就可以执行之前的整个可执行文件

#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>

int main()
{
    system("./exf");// 前面生成的可执行文件直接调用即可
    return 0;
}


=================================================

popen


      #include <stdio.h>

       FILE *popen(const char *command, const char *type);

       int pclose(FILE *stream);


可以获取内存的输出结果:

#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>

int main()
{
    char ret[1024]={0};
    FILE *fp;
    fp=popen("ps","r");
      //size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    int nread = fread(ret,1,1024,fp);
    printf("nread=%d\nret = %s\n",nread,ret);
    return 0;
}
 


 

【C/C++】Linux多进程开发 提示:这里可以添加本文要记录的大概内容:提示:以下是本篇文章正文内容,下面案例可供参考并行与并发01 /进程间通讯概念◼ 进程是一个独立的资源分配单元,不同进程(这里所说的进程通常指的是用户进程)之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源。◼ 但是,进程不是孤立的,不同的进程需要进行信息的交互和状态的传递等,因此需要进程间通信( **IPC:Inter Processes Communication** )。 阅读详情

相关推荐

Linux多进程开发-常用命令

进程的相关操作是Linux编程的重要环节。熟悉这些进程控制的api的使用,对我们初学Linux平台下的c语言编程大有帮助。本文重点介绍了,进程的创建常用的俩函数,以及进程的等待。以及system函数。之后将重点介绍一下exec族。

坏柠的博客 901

深入理解 linux swapper 进程

转载博文: http://blog.youkuaiyun.com/bengda/article/details/7681327 LINUX进程小结 id为0的进程通常是调度进程,常常被称为交换进程(swapper),该进程为内核的一部分,他并不执行任何磁盘上的程序,因此也被称为系统进程。 id为1 init进程,在自举过程结束后由内核调用。 id为2 页守护进程 对于父进程已经终止的所有进

2万+

C语言在linux上实现进程线程开发

当有子进程结束或僵尸进程时,立刻返回第一个结束的子进程ID。如果有子进程在运行,阻塞父进程。如果没有子进程在运行,返回-1。同一个进程中,原子操作是不可被线程间抢占的。一个线程中的原子操作可以实现同步,加快线程间的协调作用,进行无锁化编程。进程相互之间的变量包括指针指向的地址都是不共享的,进程间通信需要使用共享内存。进程相互之间的变量包括指针指向的地址都是不共享的,进程间通信需要使用共享内存。此操作会导致进程阻塞,用于进程间加锁使用。获取ID(ftok)

qq_26124425的博客 958

微视linux swapper进程

swapper是linux第一个线程,也就是0号线程。很多书里面都有详细介绍。 为什么linux启动之后,swapper线程就开始运行了呢? 我认为主要有两点: 第一点:静态部分。 swapper线程通过静态初始化,设置的地址空间是内核高1G的空间。也就是说其使用的正文段,数据段和linux使用的正文段和数据段是完全一致的。 第二点:动态部分。 堆栈寄存器等寄存器在内核启动阶段通过汇编语句设置。...

shipinsky的博客 1300

后端开发必须掌握的Linux命令[进程篇]

进程相关命令

vjhghjghj的博客 1150

ESP32-P4实战:LVGL V9.4 PPA加速配置与性能对比

本文详细介绍了如何在ESP32-P4平台上配置LVGL V9.4的PPA硬件加速功能,通过启用PPA加速显著提升图形处理性能并降低CPU占用率。文章包含环境准备、配置步骤、性能对比及常见问题解决方案,帮助开发者高效利用ESP32-P4的PPA加速器优化嵌入式GUI应用。

rice5的博客 1190

Linux 为什么运行 swapper

linux 系统中,当 cpu 上没有要执行的任务时,往往会运行 swapper 进程,即 idle 状态,这时我们可以说 cpu 处于空闲状态。

Mercury_Lc的博客 1627

2023年LitCTF web组wp

1、导弹迷踪2、1zjs3、php是世界上最好的语言!!4、Ping5、我Flag呢?7、作业管理系统8、Vim yyds10、这是什么?SQL!注一下!11、Flag点击就送!12、就当无事发生13、彩蛋。

m0_74160536的博客 1591

Linux--进程

我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另一个程序。当进程盗用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。进程A创建了进程B,那么A叫做父进程,B叫做子进程,父子进程是相对概念,理解为人类中的父子关系。关键区别二:vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行。进程是程序的一次运行活动,通俗点意思是程序跑起来了,系统中就多了一个进程。返回值为 0 ,代表当前进程是子进程;

weixin_59095264的博客 379

【新华三】DHCP+TFTP+ZTP自动开局实战

设备运行ZTP功能,可以自动获取并自动加载开局文件,实现设备的免现场配置和部署,从而降低人力成本,提升部署效率。使用TFTP服务器工具进行文件的上传和下载,网上很多TFTP server软件,大家可以自行下载。3CDaemon等,可以根据使用自取所需。大家应该都了解ZTP,但是目前发现除了控制器之外仅使用ZTP开局的兄弟并不是很多,因此分享此过程方便大家批量开局,留出更多时间学习更多技术。电脑打开DHCP服务器,TFTP服务器,并通过网线连接到设备的管理口,若设备较多可以通过带外交换机等进行连接,

五大连池的镜子 4981

维护测试监控LLM应用

LangFuse: 开源 + SaaS(免费/付费),LangSmith 平替,可集成 LangChain 也可直接对接 OpenAI API;LangSmith: LangChain 的官方平台,SaaS 服务(免费/付费),非开源,企业版支持私有部署;调试 Prompt 的 Playground测试/验证系统的相关指标数据集管理各种指标监控与统计:访问量、响应时长、Token 费等等。

SunnyRivers 1780

Linux 多进程开发

Linux多进程开发 文章目录进程概述程序与进程单道、多道程序设计时间片并行和并发进程状态转换进程的状态进程相关命令进程号和相关函数进程创建父子进程的虚拟地址空间父子进程之间的区别GDB 多进程调试exec函数族exec 函数族介绍exec 函数族作用图解exec 函数族进程控制进程退出孤儿进程僵尸进程进程回收wait.cwaitpid.c退出信息相关宏函数进程间通信进程间通讯概念Linux 进程间通信的方式匿名管道管道的特点为什么可以使用管道进行进程间通信管道的数据结构匿名管道的使用pipe.cfpath

qq_53111905的博客 2101

Vue3 - 超详细最新 wangEditor V5 富文本编辑器安装引入及使用教程,提供工具栏配置、基础富文本功能、API使用示例教程等(新手小白快速引入并植入到项目中)

vue3,wangEditorv5富文本编辑器,wangEditorv5官方文档,vue3最新安装wangEditorv5富文本详细使用教程,vue3使用wangEditorv5编辑器示例代码,vue3网站网页安装植入富文本编辑器教程,vue3wangEditor使用api,vue3安装富文本控制台出现报错如何解决,vue3wangEditor-v5工具栏配置,vue3中使用富文本编译器wangEditor5的方法,wangeditor5在vue3中的全使用过程,vue3超详细最新wangedi

🏆 前端领域优质创作者 4253

Linux 多进程开发(上)

Linux 多进程开发 2.1 进程概述 2.2 进程状态转换 2.3 进程创建 2.4 exec 函数族 2.5 进程控制

weixin_43412762的博客 2044

在 SAP HANA 与 HANA Cloud 中,用 SQL DDL 创建数据库视图:从设计时工件到运行时对象的全链路实践

本文介绍了在SAP HANA中通过HDI容器使用DDL定义视图的方法。主要内容包括:1)采用.hdbview设计时工件存储视图定义,构建时自动转换为运行时视图,实现版本控制和权限隔离;2)开发前需准备HDI容器、MTA项目及配置.hdiconfig文件;3)详细说明.hdbview语法结构,重点讲解WITH READ ONLY和WITH STRUCTURED PRIVILEGE CHECK的使用场景;4)提供了从创建文件到构建验证的完整流程示例;5)强调跨容器访问时需通过.hdbgrants为#OO用户授予

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 275

Clawdbot安装教程:从零开始到接入飞书

这几天,Clawdbot把整个科技圈都刷屏了。就是这个胖逼小龙虾🦞。不过现在改名叫Moltbot了。原因很简单:被Anthropic告了。Anthropic觉得Clawdbot这名字太像Claude Code的延伸产品,要求改名。真的,Anthropic你这家伙…更离谱的是,因为Clawdbot太火,Mac Mini都被抢断货了。无数人为了用它,疯狂买Mac Mini。我刚打开美团外卖,发现居然没货了???

Maynor的博客 2179

Linux应用开发之进程处理

上述共介绍了四种进程间的通信方式,分别为匿名管道,有名管道,共享内存和消息队列,其中匿名管道只能用于父子进程间的通信,因为其只能通过创建的文件描述符进行通信,只有父子进程之间可以继承到,其他进程无法获取到相关的资源。其余三种通信方式既可用于父子进程通信,也可以用作任何两个进程间的通信,因为他们都拥有一个唯一标识,会创建一个临时文件用于进程访问。还有另外一种可以用于进程间的通信方式,套接字,套接字一般用于网络通信,后续演变为进程间的一种通信方式,本文暂时不做介绍。

2302_77530416的博客 1210

ARM系统控制和管理接口System Control and Management Interface

本文档描述了一个可扩展的独立于操作系统的软件接口,用于执行各种系统控制和管理任务,包括电源和性能管理。 本文档描述了系统控制和管理接口(SCMI),它是一组操作系统无关的软件接口,用于系统管理。

AI-安全-功耗 1913

02 Linux多进程开发

Linux多进程并发

weixin_52341045的博客 976

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

一文让你玩转Linux多进程开发

信号是Linux进程间通信最古老的方式之一,是事件发生时对进程的通知机制,有时也称为软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式。使用信号的两个目的:让进程知道已经发生了一个特定的事件强迫进程执行它自己代码中的信号处理程序信号的特点:简单不能携带大量信息满足某个特定条件才发送优先级比较高查看系统定义的信号列表kill -l前三十一个为常规信号,其余为实时信号。信号的5种默认处理动作。

weixin_72686492的博客 475

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux多进程开发

多进程复习

Q_Outsider的博客 493

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

第三章 Linux多进程开发

相信大家对进程一点都不陌生,当我们打开Windows OS的任务管理器,如下图所示,就能在进程页面看到很多用户进程和系统进程,并且我们还能发现,它是动态占用CPU和内存等硬件资源的,所以,这里得到进程和程序(我们写的代码)的最大区别,也是进程的最主要特征,它是动态的、可以发生状态转换的、有生命周期的。我们也可以简单的理解为进程是程序 + 数据操作系统科普与入门之进程篇linux 中,进程是一个独立的资源分配单元,不同进程之间的资源是相互独立的,不能在一个进程中直接访问另一个进程的资源。

fantasticHQ的博客 1209

linux应用开发3.1- Linux 进程开发总结

linux应用开发3.1- Linux 进程开发总结

2401_85199775的博客 811

Linux驱动开发之进程

本文介绍了Linux驱动开发中的进程管理基础知识,重点讲解了fork()和execl()两个关键函数。fork()用于创建子进程,返回不同的值区分父子进程;execl()用于替换子进程的执行程序。文章还对比了exit()和_exit()的区别:exit()会刷新缓冲区并清理资源,而_exit()直接终止进程。通过示例代码展示了这些函数的实际应用场景,帮助开发者理解Linux多进程编程的基本原理。

2402_84111511的博客 875

linux应用开发3.1.4-linux进程开发知识总结

linux应用开发3.1.4-linux进程开发知识总结

2401_85199775的博客 982

【嵌入式Linux应用开发基础】进程实战开发

在嵌入式Linux系统中,进程是系统资源分配和调度的基本单位。每个进程都有自己的地址空间和系统资源,通过进程间的通信和同步机制,可以实现不同进程间的数据交换和协作。进程管理对于嵌入式系统的性能和稳定性至关重要。

byte轻骑兵的技术小窝 1697
上一篇: 标准C库文件操作
下一篇: 进程间的通信-IPC
mx_jun
博客等级 码龄5年 1605粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值