嵌入式學習系統編程(四)進程

目錄

一、進程

? ? ? ? 1.程序和進程

? ? ? ? 2.進程的八種狀態

????????3.? ? ?幾個狀態

? ? ? ? 4.關于進程常用命令

二、關于進程的函數

? ? ? ? 1.fork

? ? ? ? 2.面問

????????3.孤兒進程? 后臺進程

? ? ? ? 2.? ?exec函數族 (只保留父子關系,做新的事情)??

? strtok函數?

三、進程的結束

1.分類

exit和_exit的區別?

wait函數?

?waitpid函數?

四、總結


一、進程

? ? ? ? 1.程序和進程

????????內存中正在進行(運行)中的程序。

????????./a.out跑起來就是a.out對應的進程。

?????????程序 靜態 硬盤

? ???????進程 動態 內存

? ? ? ?

????????程序= 代碼 + 數據= 代碼區(text段)+棧區+堆區+BSS+Data

????????進程 = 代碼區(text段)+棧區+堆區+BSS+Data + PCB(Process Control Block)

? ? ? ? BSS:存放程序中未初始化的全局變量的一塊內存區域。

? ? ? ? DATA:存放程序中已初始化的全局變量的一塊內存區域。

? ? ? ? 2.進程的八種狀態

? ? ? ? *D??不可中斷態的睡眠態

? ? ? ? *R? 正在運行態? ? 或者? ?就緒態??

? ? ? ? *S? 可終端的睡眠態

? ? ? ? *T? stopped by job control signal

? ? ? ? ?t??stopped by debugger during the tracing

? ? ? ? ?X? 死亡態

? ? ? ??*Z? 僵尸態

????????3.? ? ?幾個狀態

??????

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?通用三態圖?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? linux系統的狀態

? ? ? ? 4.關于進程常用命令

? ? ? ? top? ?動態查看系統中進程

????????pstree -sp [pid]? ? ?查看進程樹(可指定pid號)

????????kill? ?發出信號? ? ? ?

????????????????kill -l ?//查看可以發送的信號

? ? ? ????????18) SIGCONT? //繼續信號

? ? ? ????????19) SIGSTOP? //暫停

? ? ????????? ?9) SIGKILL? //死亡信號,殺死進程

? ? kill -19 [pid] //給指定pid號的進程發送 信號

????????ps aux | grep a.out? ? ?查看pid號進程的狀態信息

????????ps -eLf | grep a.out? ? ? 查看pid和ppid號

二、關于進程的函數

? ? ? ? 1.fork

? ? ? ? ???pid_t fork(void);? ? 通過復制主調進程創建子進程。

????????一次fork返回了兩次? ? ? ? typedef? ?int? ? pid_t?

?? 成功 在父進程空間返回子進程pid,在子進程空間返回 0

? ?失敗? ? 父進程返回值-1? ? ? ?errno會被設置?

? ? ? ? 2.面問

? ? ? ? eg1如果兩次fork同時前后執行,會生成幾個進程?

? ? ? ? ? ? ? ? 4個進程

? ? ? ? eg2? ?fork()&&fork()||fork();

? ? ? ? ? ? ? ? 5個進程

? ? ? ? ? ? fork()

? ? ? ? ? /? ? ? ? ? ?\

? ? ?fork()? ? ? ? fork1()

? ? ?/ ?\? ? ? ? ? ? ? ? / ? ?\

? fork ?fork2 ?fork1 fork3

? ? ? ? ?? / ? \

? ? ? fork2 ?fork4

????????3.孤兒進程? 后臺進程

????????子進程沒有父進程就是孤兒進程,將會有 init(1)-進程 收養子進程。變成 后臺進程 (?ctrl + c) 這個信號只能發給前臺進程。? 結束后臺進程要用kill

????????子進程結束,但是父進程,沒有對子進程收尸。那就是僵尸進程。僵尸態是有危害的,消耗內存。

? ?eg1? ? ? fork創建子進程,分別打印pid

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main(void)
{pid_t pid = fork();if (pid < 0){perror("fork fail");return -1;}if (pid > 0){printf("father pid = %d ---\n",getpid());printf("pid = %d",getpid());}else if (pid == 0){printf("child pid = %d ---\n",getpid());}printf("--pid = %d --end---\n",getpid());return 0;
}

? ? ? ? 2.? ?exec函數族 (只保留父子關系,做新的事情)??

? ? ? ? ? ? ? ? 通過將新進程的各個段替換當前進程的各個段來實現,用來執行一個新的功能

????????????????int execl(const char *path, const char *arg, .../* (char ?*) NULL */);
? ? ? ? ? ? ? ?int execv(const char *path, char *const argv[]);?

? ? ? ? ? ?????????@path ? 代表要運行的新程序的名字 要包含路徑

? ? ? ? ? ? ????????? ? ? eg:

? ? ? ? ? ? ? ? ? ? ?"/home/linux/fileio/mycp"

? ? ? ? ? ?????????@arg ? 表示要運行的程序的名字

? ? ? ? ? ? ? ? ????????? eg:

? ? ? ? ? ? ? ? ? ? ?"mycp"

? ? ? ? ? ?????????@... ?可變參數(要執行程序用到的參數)

? ? ? ? ? ? ? ? ?????????eg:

? ? ? ? ? ? ? ? ? ?"src.txt","dest.txt",NULL結尾

? ? ? ? l(list)和v(vector)的區別? 傳參的方式不同

? ? ? ? ??execl( "/home/linux/fileio/mycp","mycp", "src.txt","dest.txt",NULL);

? ? ? ? ? char * const args[] = {"mycp", "src.txt","dest.txt",NULL};

? ? ? ? ? int execv( "/home/linux/fileio/mycp", args);

? ? ? ? ???printf("---exec---code---");后續代碼不執行,因為段被替換

? ? ? ?????????int execlp(const char *file, char *const argv[]);
? ? ? ?????????int execvp(const char *file, char *const argv[],char *const envp[]);

????????????????p 表示 PATH系統環境變量(系統運行時侯需要的一些變量)

????????????????表示要執行的可執行文件到PATH環境變量中去尋找

????????????????execlp("ls","ls","-l","/",NULL);

? ? ? ? ? ? ? ? char *const args[] = {"ls","-l","/",NULL};

? ? ? ? ? ? ????execlp("ls","ls","-l","/",NULL);

????????

? ? ? ? ? ?int execle(const char *path, const char *arg, .../*, (char *) NULL, char * const envp[] */);? ?看要運行的程序需不需要環境變量,需要就可以傳。不需要的話用之前的方式運行起來就行。

? ? ? ? ? ?int execvpe(const char *file, char *const argv[],char *const envp[]);

? ? ? ? ? e 表示用戶環境變量 ---提供了一種方式,可以給要運行的程序傳遞環境變量

? ? ? ? ? ?extern char **environ;

? ? ? ? ? ? int main{

? ? ? ? ? ? ? ? ? ?execle("/usr/bin/env","env",NULL,environ);

? ? ? ? ? ? ? ? ? ?char *const my_env[] = {"USERNAME=linux","PSWD=123456?",NULL};

????????????????? ?execle("/usr/bin/env","env",NULL,my_env);

? ? ? ? ? ? ? ? ? ?execvpe("env",my_env,NULL);

? ? ? ? ? ? ? ? ? ?return 0;

}

? ? ? ? ? ? ??

? strtok函數?

????????作用,提取字符串

????????char *strtok(char *str, const char *delim);

????????

? ????????? @str ? --- 要提取完整字符串 ? -- buf

? ? ? ? ? ? ? ?如果連續的分割 ?填NULL

? ????????? @delim --- 分隔標志 // " ;,"可以有多個分割標志

? ?

? ????????? 返回值:

? ????????? ? 成功 返回提取到的字符串的地址

? ????????? ? 失敗 NULL

eg? ? strtok的使用?

#include<stdio.h>
#include<string.h>
int main(int argc, char const *argv[])
{char buf[1024]={"ls -l ;/"};
#if 0	char *s1 = strtok(buf," ;");printf("s1 = %s\n",s1);char *s2 = strtok(NULL," ;");printf("s2 = %s\n",s2);char *s3 = strtok(NULL," ;");printf("s3 = %s\n",s3);
#endifchar *s[5] = {NULL};int i= 0;s[i] = strtok(buf," ;");while (s[++i] = strtok(NULL," ;"));for ( i = 0; i < 5; ++i){printf("s[%d]=%s\n",i,s[i]);}return 0;
}

eg1? ?實現一個shell程序

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>int main(int argc,const char *argv[])
{char buf[1024] = {0};while (1){printf("myshell$ ");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = '\0';if (strncmp(buf,"exit",4) == 0 || strncmp(buf,"quit",4) == 0){printf("exit---myshll---\n");return 0;}int i = 0;char *arg[10] = {NULL};arg[i] = strtok(buf," ");while (arg[++i] = strtok(NULL," "));
#if 0for (i = 0; i < 10; ++i){printf("%d:%s\n",i,arg[i]);}
#endif pid_t pid = fork();if (pid < 0){perror("fork fail");return -1;}if (pid > 0){wait(NULL);continue;}else if (pid == 0){if (execvp(arg[0],arg) < 0){perror("execvp fail");return -1;}}}return 0;
}

?

三、進程的結束

1.分類

正常結束:

? ? ? ? 1)main 中 return

? ? ? ? 2)exit() //庫函數

? ? ? ? ? ?c庫函數,會執行io庫的清理工作,關閉所有 的流,以及所有打開的文件。

? ? ? ? ? ?注冊清理函數(atexit)。

? ? ? ? 3)_exit,_Exit 會關閉所有的已經打開的文件,不執行清理函數。 //系統調用

? ? ? ? //4) 主線程退出 ?

? ? ? ? //5)主線程調用pthread_exit

? ? ? ?? ? ? ?異常終止:

? ? ? ? 6)abort() //發送一個SIGABRT

? ? ? ? 7)signal ?//發信號 結束了進程 ?kill pid ?-9

? ? ? ? //8) 最后一個線程被pthread_cancle

? ? ?exit函數

? ? ? #include <stdlib.h>

? ? ? ?void exit(int status);

? ? ? ? ?功能:

? ? ? ? ? ? 造成進程正常結束

? ? ? ? ?參數:

? ? ? ? ? ?@status ? 帶出一個狀態值給到父進程? 結合wait和宏才能查看狀態值

return 0 自動調取一個exit函數,從而調用atexit函數,_exit不調用atexit函數

_exit

? ? ? ? #include <unistd.h>

? ? ? ?void _exit(int status);

? ? ? ? ?功能:

? ? ? ? ? ? 造成進程正常結束 ,立刻結束

? ? ? ? ?參數:

? ? ? ? ? ?@status ? 帶出一個狀態值給到父進程? ?結合wait和宏才能查看狀態值

exit和_exit的區別?

區別:

? ?exit 是庫函數

? ? ? 退出前,

? ? ? 1.先清理IO緩存

? ? ? 2.調用清理函數

? ?_exit 是系統調用

? ? ? 立即結束進程

atexit

? ? ? ?#include <stdlib.h>

? ? ? ?int atexit(void (*function)(void));

? ? ? ?

? ? ? ?功能:

? ? ? ? ? 注冊一個退出清理函數

? ? ? ?參數:

? ? ? ? @function ---- 函數指針

? ? ? ? ? ? ? ? ? ? ? ?函數類型 ?void func1(void)

? ? ? ?

? ? ? ?返回值:

? ? ? ? 成功 返回0

? ? ? ? 失敗 非0

? ? ? ? ps注冊順序和調用順序相反(有棧的結構)

????????

狀態值:

? ?status & 0377 ?=> 一個字節的數據

? ?

? ? 1 1 1 1 1 1 1 1 ?//0377 二進制

? ?

? ? 0 0 0 0 0 0 0 0

? ?

? ? //數值 個數 256 個值

? ?

wait函數?

????????pid_t wait(int *wstatus);

?????????用于等待子進程的狀態的變化,并獲取一些該子進程的信息。

? ? ? ? 三種變化

? ? ? ? 1.子進程結束?

????????2.子進程被信號暫停(kill? ?SIGSTOP)

? ? ? ? 3.子進程因信號被回恢復(SIGCONT)

? ? ? 參數:

? ? ? ? @status? 獲取子進程退出時的狀態信息(要用宏才能提取出來)? ?//被調修改主調的方式

? ? ? 返回值:

? ? ? ? 成功 返回狀態改變了的子進程的pid

? ? ? ? 失敗 -1

?????????如果不關心其退出狀態一般用NULL表示

? ?

? ? 注意:

? ? ? ?wait 本身是個阻塞操作(只有有子進程時,才阻塞,沒有子進程時,立即返回wait調用失敗) //子進程結束

? ? ? ? 父進程在子進程結束后用wait進行資源回收和狀態的獲取稱為"關心"。

? ? ? ? 不進行資源回收的結束的子進程是僵尸態。

? ? ? ?

? ? 宏:

? ?

? ? //正常結束

? ? ? ?WIFEXITED(wstatus) ? //判斷子進程是否是正常結束

? ? ? ? ? ? ? ? ? ? ? ? ? ? //正常結束 則為真 ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ?WEXITSTATUS(wstatus) //使用這個宏去那返回值

? ? ? ?

? ? //異常結束

? ? ? ?WIFSIGNALED(wstatus) //判斷子進程是否是被信號結束

? ? ? ?WTERMSIG(wstatus) //獲得 結束子進程的那個信號編號

eg 1? ??WIFEXITED(wstatus)和? WEXITSTATUS(wstatus)

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>int main(void)
{pid_t pid = fork();if (pid < 0){perror("fork fail");return -1;}if (pid > 0){sleep(3);printf("---wait----child---\n");int status;wait(&status);printf("status = %d\n",status);if (WIFEXITED(status)){printf("child status = %d\n",WEXITSTATUS(status));}}else if (pid == 0){printf("---child----exit---\n");exit(99);}return 0;
}

?eg 1? ??WIFSIGNALED(wstatus) 和 WTERMSIG(wstatus)

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>int main(void)
{pid_t pid = fork();if (pid < 0){perror("fork fail");return -1;}if (pid > 0){sleep(3);printf("---wait----child---\n");int status;//wait(&status);//waitpid(-1,&status,WNOHANG);waitpid(-1,&status,0);printf("status = %d\n",status);if (WIFEXITED(status)){printf("child status = %d\n",WEXITSTATUS(status));}}else if (pid == 0){printf("---child----exit---\n");exit(99);}return 0;
}

eg3?? ? wait的使用

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>int main(void)
{pid_t pid = fork();if (pid < 0){perror("fork fail");return -1;}if (pid > 0){   sleep(3);printf("---wait----child---\n");int status;wait(&status);printf("status=%d\n",status);if(WIFEXITED(status)){printf("child status = %d\n",WEXITSTATUS(status));}}else if (pid == 0){printf("---child----exit---\n");exit(99);}return 0;
}

?eg4? ?無人機狀態模擬

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>void do_fly(void)
{int i = 0;while (i < 5){printf("---%s---\n",__FUNCTION__);++i;sleep(1);}exit(88);
}void do_video(void)
{int i = 0;while (i < 3){printf("---%s---\n",__FUNCTION__);++i;sleep(1);}exit(77);
}
void do_transmit(void)
{int i = 0;while (i < 4){printf("---%s---\n",__FUNCTION__);++i;sleep(1);}exit(66);
}
void do_store(void)
{int i = 0;while (i < 6){printf("---%s---\n",__FUNCTION__);++i;sleep(1);}exit(55);
}int main(void)
{int i = 0;pid_t pid = 0;for (i = 0; i < 4; ++i){pid = fork();if (pid < 0){perror("fork fail");return -1;}if (pid == 0)break;}if (pid > 0){int status;for (i = 0; i < 4; ++i){wait(&status);if (WIFEXITED(status)){switch(WEXITSTATUS(status)){case 55:printf("do_store exit---\n");break;case 66:printf("do_transmit exit---\n");break;case 77:printf("do_video exit---\n");break;case 88:printf("do_fly exit---\n");break;}}}}else if (pid == 0){switch(i){case 0:do_fly();break;case 1:do_video();break;case 2:do_transmit();break;case 3:do_store();break;}}return 0;
}

?waitpid函數?

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

? ? ? ?功能:

? ? ? ? ? 等待子進程狀態改變

? ? ? ?參數:

? ? ? ? ?@pid ? ? ? ?

? ? ? ? ? ? ? ?< -1 ? meaning wait for any child process whose process group ID is equal to the absolute value of pid.

? ? ? ? ? ? ? ? ?eg: -100

? ? ? ? ? ? ? ? ? ?表示等待 進程組ID 為 |-100| 這個進程組中的任意子進程

? ? ? ? ? ? ? ?-1 ? ? meaning wait for any child process.

? ? ? ? ? ? ? ? ? ?表示等待 當前父進程的任意子進程

? ? ? ? ? ? ? ?0 ? ? ?meaning wait for any child process whose process group ID is equal to that of the calling process.

? ? ? ? ? ? ? ? ? ?等待 進程組ID 等于 父進程pid的那個進程組中的任意子進程 ? ? ? ? ? ?

? ? ? ? ? ? ? ?> 0 ? ?meaning wait for the child whose process ID is equal to the value of pid.

? ? ? ? ? ? ? ? ? eg: 100

? ? ? ? ? ? ? ? ? ? ? 等待 進程pid 為 100的這個子進程狀態改變

? ? ? ? ?@wstatus ?//與wait的參數類似? ??如果不關心其退出狀態一般用NULL表示

? ? ? ? 獲取準確狀態值也是用

? ? ? ? ?@options ?//

? ? ? ? ? ? ? ? ? ?0 ? ? ? ? //阻塞調用

? ? ? ? ? ? ? ? ? ?WNOHANG ? //非阻塞? ?不斷的看子進程狀態有沒有改變,沒有改變就返回了。有改變了,將資源回收,并進行if判斷下面的操作。

? ? ? ?

? ? ? ?

? ? ? ?waitpid(-1, &wstatus, 0); ?//等價于 wait(&wstatus)

四、總結

//進程

創建 ?--- fork

運行

? ?//1.跟父進程類似 事情 ?

? ?//2.獨立運行一個新程序 ---exec函數

? ?//3.運行多個不同任務

結束

? ?正常結束 ?

? ? ?//1.return //main

? ? ?//2.exit

? ? ?//3._exit

? ?異常結束

? ? ?//4.abort ?//信號

? ? ?//5.signal //發其它信號

進程結束是兩種特殊狀態

? ?孤兒進程 ?

? ?僵尸進程 ? --- wait/waitpid ?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915187.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915187.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915187.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux中添加重定向(Redirection)功能到minishell

前言&#xff1a;在談論添加minishell之前&#xff0c;我再重談一下重定向的具體實現等大概思想&#xff01;&#xff01;&#xff01;方便自己回顧&#xff01;&#xff01;&#xff01; 目錄 一、重定向&#xff08;Redirection&#xff09;原理詳解 1、文件描述符基礎 2、…

Django由于數據庫版本原因導致數據庫遷移失敗解決辦法

在django開發中&#xff0c;一般我們初始化一個項目之后&#xff0c;創建應用一般就會生成如下的目錄&#xff1a;django-admin startproject myproject python manage.py startapp blogmyproject/ ├── manage.py └── myproject/ | ├── __init__.py | ├── se…

C++STL系列之vector

前言 vector是變長數組&#xff0c;有點像數據結構中的順序表&#xff0c;它和list也是經常被拿出作對比的&#xff0c; vector使用動態分配數組來存儲它的元素。當新元素插入時候&#xff0c;這個數組需要被重新分配大小&#xff0c;如果擴容&#xff0c;因為要開一個新數組把…

Functional C++ for Fun Profit

Lambda Conf上有人講C函數式編程。在Functional Conf 2019上&#xff0c;就有主題為“Lambdas: The Functional Programming Companion of Modern C”的演講。演講者介紹了現代C中函數式編程相關內容&#xff0c;講解了如何使用Lambda表達式編寫符合函數式編程原則的C代碼&…

Python基礎理論與實踐:從零到爬蟲實戰

引言Python如輕舟&#xff0c;載你探尋數據寶藏&#xff01;本文從基礎理論&#xff08;變量、循環、函數、模塊&#xff09;啟航&#xff0c;結合requests和BeautifulSoup實戰爬取Quotes to Scrape&#xff0c;適合零基礎到進階者。文章聚焦Python基礎&#xff08;變量、循環、…

ThingJS開發從入門到精通:構建三維物聯網可視化應用的完整指南

文章目錄第一部分&#xff1a;ThingJS基礎入門第一章 ThingJS概述與技術架構1.1 ThingJS平臺簡介1.2 技術架構解析1.3 開發環境配置第二章 基礎概念與核心API2.1 核心對象模型2.2 場景創建與管理2.3 對象操作基礎第三章 基礎開發實戰3.1 第一個ThingJS應用3.2 事件系統詳解3.3 …

關于list

1、什么是listlist是一個帶頭結點的雙向循環鏈表模版容器&#xff0c;可以存放任意類型&#xff0c;需要顯式定義2、list的使用有了前面學習string和vector的基礎&#xff0c;學習和使用list會方便很多&#xff0c;因為大部分的內容依然是高度重合的。與順序表不同&#xff0c;…

Mysql 查看當前事務鎖

在 MySQL 中查看事務鎖&#xff08;鎖等待、鎖持有等&#xff09;&#xff0c;可以使用以下方法&#xff1a; 一、查看當前鎖等待情況&#xff08;推薦&#xff09; SELECTr.trx_id AS waiting_trx_id,r.trx_mysql_thread_id AS waiting_thread,r.trx_query AS waiting_query,b…

【Keil5-map文件】

Keil5-map文件■ map文件■ map文件

k8s 基本架構

基于Kubernetes(K8s)的核心設計&#xff0c;以下是其關鍵基本概念的詳細解析。這些概念構成了K8s容器編排系統的基石&#xff0c;用于自動化部署、擴展和管理容器化應用。### 一、K8s核心概念概覽 K8s的核心對象圍繞容器生命周期管理、資源調度和服務發現展開&#xff0c;主要包…

Bell不等式賦能機器學習:微算法科技MLGO一種基于量子糾纏的監督量子分類器訓練算法技術

近年來&#xff0c;量子計算&#xff08;Quantum Computing&#xff09; 和 機器學習&#xff08;Machine Learning&#xff09; 的融合成為人工智能和計算科學領域的重要研究方向。隨著經典計算機在某些復雜任務上接近計算極限&#xff0c;研究人員開始探索量子計算的獨特優勢…

Edge瀏覽器設置網頁自動翻譯

一.瀏覽網頁自動翻譯設置->擴展->獲取Microsoft Edge擴展->搜索“沉浸式翻譯”->獲取 。提示&#xff1a;如果采用其他的翻譯擴展沒找自動翻譯功能&#xff0c;所以這里選擇“沉浸式翻譯”二.基于Java WebElement時自動翻譯Java關鍵代碼&#xff1a;提示&#xff1…

TCP/UDP協議深度解析(四):TCP的粘包問題以及異常情況處理

&#x1f50d; 開發者資源導航 &#x1f50d;&#x1f3f7;? 博客主頁&#xff1a; 個人主頁&#x1f4da; 專欄訂閱&#xff1a; JavaEE全棧專欄 本系列往期內容~ TCP/UDP協議深度解析&#xff08;一&#xff09;&#xff1a;UDP特性與TCP確認應答以及重傳機制 TCP/UDP協議深…

R 基礎語法

R 基礎語法 R 語言是一種針對統計計算和圖形表示而設計的編程語言&#xff0c;廣泛應用于數據分析、統計學習、生物信息學等領域。本文將為您介紹 R 語言的基礎語法&#xff0c;幫助您快速入門。 1. R 語言環境搭建 在開始學習 R 語言之前&#xff0c;您需要安裝并配置 R 語言環…

語義熵怎么增強LLM自信心的

語義熵怎么增強LLM自信心的 一、傳統Token熵的問題(先理解“痛點”) 比如模型回答“阿司匹林是否治療頭痛?”→ 輸出“是” 傳統Token熵:只看“詞的概率”,比如“是”這個詞的概率特別高(Token熵0.2,數值低說明確定性強 )。 但實際風險:醫學場景里,“是”的字面肯定…

javaweb的幾大常見漏洞

CTF javaweb中幾大常見漏洞(基于java-security靶場) 對于CTF而言&#xff0c;java類型的題目基本都是白盒代碼審計&#xff0c;在java類型的web題目增長的今天&#xff0c;java代碼審計能力在ctf比賽中尤為重要。 這篇博客主要是給大家介紹一下一些常見漏洞在java代碼里面大概是…

【設計模式C#】外觀模式(用于解決客戶端對系統的許多類進行頻繁溝通)

一種結構性設計模式。特點是將復雜的子系統調用邏輯封裝到一個外觀類&#xff0c;從而使客戶端更容易與系統交互。優點&#xff1a;簡化了接口的調用&#xff1b;降低了客戶端與子系統的耦合度&#xff1b;封裝了子系統的邏輯。缺點&#xff1a;引入了額外的類&#xff0c;可能…

【PTA數據結構 | C語言版】二叉堆的快速建堆操作

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;將 n 個順序存儲的數據用快速建堆操作調整為最小堆&#xff1b;最后順次輸出堆中元素以檢驗操作的正確性。 輸入格式&#xff1a; 輸入首先給出一個正整數 c&#xff08;≤1…

【數據結構初階】--雙向鏈表(二)

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言&#xff1a;生活是默默的堅持&#xff0c;毅力是永久的…

vue-cli 模式下安裝 uni-ui

目錄 easycom 自定義easycom配置的示例 npm安裝 uni-ui 準備 sass 安裝 uni-ui 注意 easycom 傳統vue組件&#xff0c;需要安裝、引用、注冊&#xff0c;三個步驟后才能使用組件。easycom將其精簡為一步。 只要組件路徑符合規范&#xff08;具體見下&#xff09;&#…