版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第6章 文件I/O編程,系統(tǒng)調(diào)用與用戶編程接口(API) 底層文件I/O操作 嵌入式Linux串口應(yīng)用編程 標(biāo)準(zhǔn)I/O編程 實(shí)驗(yàn),系統(tǒng)調(diào)用與用戶編程接口(API),系統(tǒng)調(diào)用: 操作系統(tǒng)提供給用戶程序調(diào)用的一組“特殊”接口,用戶程序可以通過這組“特殊”接口來獲得操作系統(tǒng)內(nèi)核提供的服務(wù)。,系統(tǒng)調(diào)用與用戶編程接口(API),為什么用戶程序不能直接訪問系統(tǒng)內(nèi)核提供的服務(wù)? 為了更好地保護(hù)內(nèi)核空間,將程序的運(yùn)行空間分為內(nèi)核空間和用戶空間(也就是常稱的內(nèi)核態(tài)和用戶態(tài)),它們分別運(yùn)行在不同的級(jí)別上,在邏輯上是相互隔離的。因此,用戶進(jìn)程在通常情況下不允許訪問內(nèi)核數(shù)據(jù),也無法使用內(nèi)核函數(shù),它們只能在用戶空間操作
2、用戶數(shù)據(jù),調(diào)用用戶空間的函數(shù)。 進(jìn)行系統(tǒng)調(diào)用時(shí),程序運(yùn)行空間需要從用戶空間進(jìn)入內(nèi)核空間,處理完后再返回到用戶空間。,用戶空間,內(nèi)核空間,系統(tǒng)調(diào)用與用戶編程接口(API),前面講到的系統(tǒng)調(diào)用并不是直接與程序員進(jìn)行交互的,它僅僅是一個(gè)通過軟中斷機(jī)制向內(nèi)核提交請(qǐng)求,以獲取內(nèi)核服務(wù)的接口。在實(shí)際使用中程序員調(diào)用的通常是用戶編程接口API,系統(tǒng)調(diào)用與用戶編程接口(API),Linux中的系統(tǒng)調(diào)用包含在Linux的libc庫中,通過標(biāo)準(zhǔn)的C函數(shù)調(diào)用方法可以調(diào)用這些系統(tǒng)調(diào)用。,系統(tǒng)調(diào)用與用戶編程接口(API),例 write系統(tǒng)調(diào)用,Cound=write(file,buffer,nbytes),系統(tǒng)調(diào)用與
3、用戶編程接口(API),系統(tǒng)命令相對(duì)API更高了一層,它實(shí)際上是一個(gè)可執(zhí)行程序,它的內(nèi)部調(diào)用了用戶編程接口(API)來實(shí)現(xiàn)相應(yīng)的功能,# cp /floppy/TEST /tmp/test,cp命令調(diào)用了用戶編程接口(API)open()、write()與read(),系統(tǒng)調(diào)用與用戶編程接口(API),系統(tǒng)調(diào)用是用戶空間和內(nèi)核空間交互的一種有效手段,除了系統(tǒng)本身提供的系統(tǒng)調(diào)用外,用戶也可以添加自已的系統(tǒng)調(diào)用。,第6章 文件I/O編程,系統(tǒng)調(diào)用與用戶編程接口(API) 底層文件I/O操作 嵌入式Linux串口應(yīng)用編程 標(biāo)準(zhǔn)I/O編程 實(shí)驗(yàn),底層文件I/O操作,文件描述符 函數(shù)說明 文件鎖 多路復(fù)
4、用,文件描述符,內(nèi)核如何區(qū)分和引用特定的文件? 通過文件描述符。文件描述符是一個(gè)非負(fù)的整數(shù),它是一個(gè)索引值,并指向在內(nèi)核中每個(gè)進(jìn)程打開文件的記錄表。當(dāng)打開一個(gè)現(xiàn)存文件或創(chuàng)建一個(gè)新文件時(shí),內(nèi)核就向進(jìn)程返回一個(gè)文件描述符;當(dāng)需要讀寫文件時(shí),也需要把文件描述符作為參數(shù)傳遞給相應(yīng)的函數(shù)。 一個(gè)進(jìn)程啟動(dòng)時(shí),通常會(huì)打開3個(gè)文件: 標(biāo)準(zhǔn)輸入 標(biāo)準(zhǔn)輸出 標(biāo)準(zhǔn)出錯(cuò)處理。,描述符為0,描述符為2,描述符為1,函數(shù)說明,open(): 用于打開或創(chuàng)建文件,可以指定文件的屬性及用戶的權(quán)限等各種參數(shù)。 close():用于關(guān)閉一個(gè)被打開的文件。當(dāng)一個(gè)進(jìn)程終止時(shí),所有被它打開的文件都由內(nèi)核自動(dòng)關(guān)閉,很多程序都使用這一功能
5、而不顯示地關(guān)閉一個(gè)文件。 read():用于將從指定的文件描述符中讀出的數(shù)據(jù)放到緩存區(qū)中,并返回實(shí)際讀入的字節(jié)數(shù)。若返回0,則表示沒有數(shù)據(jù)可讀,即已達(dá)到文件尾。讀操作從文件的當(dāng)前指針位置開始。,函數(shù)說明,write(): 用于向打開的文件寫數(shù)據(jù),寫操作從文件的當(dāng)前指針位置開始。對(duì)磁盤文件進(jìn)行寫操作,若磁盤已滿或超出該文件的長(zhǎng)度,則write()函數(shù)返回失敗。 lseek():用于在指定的文件描述符中將文件指針定位到相應(yīng)的位置。只能用在可定位(可隨機(jī)訪問)文件操作中。管道、套接字和大部分字符設(shè)備文件是不可定位的,這些文件中無法使用lseek()調(diào)用。,函數(shù)格式(1),/* copy_file.c
6、 */ #include #include #include #include #include #include #define BUFFER_SIZE 1024 /* 每次讀寫緩存大小,影響運(yùn)行效率*/ #define SRC_FILE_NAME src_file /* 源文件名 */ #define DEST_FILE_NAME dest_file“ /* 目標(biāo)文件名文件名 */ #define OFFSET 10240 /* 拷貝的數(shù)據(jù)大小 */,int main() int src_file, dest_file; unsigned char buffBUFFER_SIZE; int
7、 real_read_len; src_file = open(SRC_FILE_NAME, O_RDONLY); dest_file = open(DEST_FILE_NAME, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); if (src_file 0) write(dest_file, buff, real_read_len); close(dest_file); close(src_file); return 0; ,文件鎖,Linux中軟件、硬件資源都是文件,文件鎖是用于解決這些資源的共享使用的一種機(jī)制 建議性鎖:進(jìn)程對(duì)文件上
8、鎖時(shí)檢查是否有鎖存在,尊重已有的鎖。 強(qiáng)制性鎖: 是由內(nèi)核執(zhí)行的鎖,當(dāng)一個(gè)文件被上鎖進(jìn)行寫入操作的時(shí)候,內(nèi)核將阻止其他任何文件對(duì)其進(jìn)行讀寫操作。采用強(qiáng)制性鎖對(duì)性能的影響很大,每次讀寫操作都必須檢查是否有鎖存在。 lockf(): 用于對(duì)文件施加建議性鎖 fcntl(): 不僅可以施加建議性鎖,還可以施加強(qiáng)制鎖。同時(shí),fcntl()還能對(duì)文件的某一記錄上鎖,也就是記錄鎖。,文件鎖,記錄鎖又可分為讀取鎖和寫入鎖 讀取鎖又稱為共享鎖,它能夠使多個(gè)進(jìn)程都能在文件的同一部分建立讀取鎖。 寫入鎖又稱為排斥鎖,在任何時(shí)刻只能有一個(gè)進(jìn)程在文件的某個(gè)部分上建立寫入鎖。當(dāng)然,在文件的同一部分不能同時(shí)建立讀取鎖和寫
9、入鎖。,fcntl()函數(shù)格式(1),fcntl()函數(shù)格式(2)- flock結(jié)構(gòu),struct flock short l_type; off_t l_start; short l_whence; off_t l_len; pid_t l_pid; ,/* lock_set.c */ int lock_set(int fd, int type) struct flock old_lock, lock; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_type = type; lock.l_pid = -1
10、; fcntl(fd, F_GETLK, ,struct flock short l_type; off_t l_start; short l_whence; off_t l_len; pid_t l_pid; ,lock.l_type = type; if (fcntl(fd, F_SETLKW, ,int main(void) int fd; fd = open(hello,O_RDWR | O_CREAT, 0644); if(fd 0) printf(Open file errorn); exit(1); lock_set(fd, F_WRLCK); getchar(); lock_s
11、et(fd, F_UNLCK); getchar(); close(fd); exit(0); ,/* write_lock.c */ #include #include #include #include #include #include #include lock_set.c,終端一 $ ./write_lock write lock set by 4994 release lock by 4994,終端二 $ ./write_lock write lock already set by 4994 write lock set by 4997 release lock by 4997,/
12、* read_lock.c */ #include lock_set.c int main(void) int fd; fd = open(hello,O_RDWR | O_CREAT, 0644); if(fd b)?(a):(b) int main(void) int fdsIN_FILES; char bufMAX_BUFFER_SIZE; int i, res, real_read, maxfd; struct timeval tv; fd_set inset,tmp_inset; /*首先按一定的權(quán)限打開兩個(gè)源文件*/ fds0 = 0; if(fds1 = open (in1, O
13、_RDONLY|O_NONBLOCK) 0) printf(Open in1 errorn); return 1; ,if(fds2 = open (in2, O_RDONLY|O_NONBLOCK) in2 select call test programme end,$./multiplex_select SELECT CALL select call TEST PROGRAMME test programme END end,#define MAX_BUFFER_SIZE 1024 /* 緩沖區(qū)大小*/ #define IN_FILES 3 /* 多路復(fù)用輸入文件數(shù)目*/ #define
14、 TIME_DELAY 60 /* 超時(shí)時(shí)間秒數(shù) */ #define MAX(a, b) (a b)?(a):(b) int main(void) struct pollfd fdsIN_FILES; char bufMAX_BUFFER_SIZE; int i, res, real_read, maxfd; /*首先按一定的權(quán)限打開兩個(gè)源文件*/ fds0.fd = 0; if(fds1.fd = open (in1, O_RDONLY|O_NONBLOCK) 0) printf(Open in1 errorn); return 1; if(fds2.fd = open (in2, O_R
15、DONLY|O_NONBLOCK) 0) printf(Open in2 errorn); return 1; ,/* multiplex_poll.c */,/*取出兩個(gè)文件描述符中的較大者*/ for (i = 0; i IN_FILES; i+) fdsi.events = POLLIN; /*循環(huán)測(cè)試該文件描述符是否準(zhǔn)備就緒,并調(diào)用select函數(shù)對(duì)相關(guān)文件描述符做對(duì)應(yīng)操作*/ while(fds0.events | fds1.events | fds2.events) if (poll(fds, IN_FILES, 0) 0) printf(Poll errorn); return
16、1; for (i = 0; i 0:只要有數(shù)據(jù)可讀或者經(jīng)過TIME個(gè)十分之一秒的時(shí)間,read()函數(shù)則立即返回,返回值為被讀取的字節(jié)數(shù)。如果超時(shí)并且未讀到數(shù)據(jù),則read()函數(shù)返回0。 MIN 0和TIME 0:當(dāng)有MIN個(gè)字節(jié)可讀或者兩個(gè)輸入字符之間的時(shí)間間隔超過TIME個(gè)十分之一秒時(shí),read()函數(shù)才返回。,終端模式(3)- 原始模式,原始模式是一種特殊的非規(guī)范模式。在原始模式下,所有的輸入數(shù)據(jù)以字節(jié)為單位被處理。在這個(gè)模式下,終端是不可回顯的,而且所有特定的終端輸入/輸出控制處理不可用。 通過調(diào)用cfmakeraw()函數(shù)可以將終端設(shè)置為原始模式,而且該函數(shù)通過以下代碼可以得到實(shí)
17、現(xiàn)。,termios_p-c_iflag ,設(shè)置串口屬性的基本流程 (1),保存原先串口配置 首先,為了安全起見和以后調(diào)試程序方便,可以先保存原先串口的配置,在這里可以使用函數(shù)tcgetattr(fd, ,cfmakeraw(,設(shè)置串口屬性的基本流程 (3),設(shè)置波特率 設(shè)置波特率有專門的函數(shù),用戶不能直接通過位掩碼來操作。設(shè)置波特率的主要函數(shù)有:cfsetispeed()和cfsetospeed()。,設(shè)置字符大小 與設(shè)置波特率不同,設(shè)置字符大小并沒有現(xiàn)成可用的函數(shù),需要用位掩碼。一般首先去除數(shù)據(jù)位中的位掩碼,再重新按要求設(shè)置。,cfsetispeed(,new_cfg.c_cflag /*
18、 用數(shù)據(jù)位掩碼清空數(shù)據(jù)位設(shè)置 */,設(shè)置串口屬性的基本流程 (4),設(shè)置奇偶校驗(yàn)位 設(shè)置奇偶校驗(yàn)位需要用到termios中的兩個(gè)成員:c_cflag和c_iflag。首先要激活c_cflag中的校驗(yàn)位使能標(biāo)志PARENB和是否要進(jìn)行偶校驗(yàn),同時(shí)還要激活c_iflag中的對(duì)于輸入數(shù)據(jù)的奇偶校驗(yàn)使能(INPCK)。,偶校驗(yàn),奇校驗(yàn),new_cfg.c_cflag |= (PARODD | PARENB); new_cfg.c_iflag |= INPCK;,new_cfg.c_cflag |= PARENB; new_cfg.c_cflag ,設(shè)置串口屬性的基本流程 (5),設(shè)置停止位 設(shè)置停止位
19、是通過激活c_cflag中的CSTOPB而實(shí)現(xiàn)的。若停止位為一個(gè),則清除CSTOPB,若停止位為兩個(gè),則激活CSTOPB。以下分別是停止位為一個(gè)和兩個(gè)時(shí)的代碼:,new_cfg.c_cflag /* 將停止位設(shè)置為兩個(gè)比特 */,設(shè)置最少字符和等待時(shí)間 在對(duì)接收字符和等待時(shí)間沒有特別要求的情況下,可以將其設(shè)置為0,則在任何情況下read()函數(shù)立即返回,new_cfg.c_ccVTIME = 0; new_cfg.c_ccVMIN = 0;,設(shè)置串口屬性的基本流程 (6),清除串口緩沖 由于串口在重新設(shè)置之后,需要對(duì)當(dāng)前的串口設(shè)備進(jìn)行適當(dāng)?shù)奶幚?,這時(shí)就可調(diào)用在中聲明的tcdrain()、tcf
20、low()、tcflush()等函數(shù)來處理目前串口緩沖中的數(shù)據(jù),int tcdrain(int fd); /* 使程序阻塞,直到輸出緩沖區(qū)的數(shù)據(jù)全部發(fā)送完畢*/ int tcflow(int fd, int action) ; /* 用于暫停或重新開始輸出 */ int tcflush(int fd, int queue_selector); /* 用于清空輸入/輸出緩沖區(qū)*/,在本實(shí)例中使用tcflush()函數(shù),對(duì)于在緩沖區(qū)中的尚未傳輸?shù)臄?shù)據(jù),或者收到的但是尚未讀取的數(shù)據(jù),其處理方法取決于queue_selector的值,它可能的取值有以下幾種。 TCIFLUSH:對(duì)接收到而未被讀取的數(shù)據(jù)
21、進(jìn)行清空處理。 TCOFLUSH:對(duì)尚未傳送成功的輸出數(shù)據(jù)進(jìn)行清空處理。 TCIOFLUSH:包括前兩種功能,即對(duì)尚未處理的輸入輸出數(shù)據(jù)進(jìn)行清空處理。,tcflush(fd, TCIFLUSH);,設(shè)置串口屬性的基本流程 (7),激活配置 在完成全部串口配置之后,要激活剛才的配置并使配置生效。這里用到的函數(shù)是tcsetattr() 。,tcsetattr(int fd, int optional_actions, const struct termios *termios_p);,其中參數(shù)termios_p是termios類型的新配置變量。 參數(shù)optional_actions可能的取值有以下
22、三種: TCSANOW:配置的修改立即生效。 TCSADRAIN:配置的修改在所有寫入fd的輸出都傳輸完畢之后生效。 TCSAFLUSH:所有已接受但未讀入的輸入都將在修改生效之前被丟棄。 該函數(shù)若調(diào)用成功則返回0,若失敗則返回1,if (tcsetattr(fd, TCSANOW, ,串口使用 (1),打開串口 打開串口和打開普通文件一樣,使用open()函數(shù)。,fd = open( /dev/ttyS0, O_RDWR | O_NOCTTY | O_NDELAY);, O_NOCTTY標(biāo)志用于通知Linux系統(tǒng),該參數(shù)不會(huì)使打開的文件成為這個(gè)進(jìn)程的控制終端。如果沒有指定這個(gè)標(biāo)志,那么任何一
23、個(gè)輸入(諸如鍵盤中止信號(hào)等)都將會(huì)影響用戶的進(jìn)程。 O_NDELAY標(biāo)志通知Linux系統(tǒng),這個(gè)程序不關(guān)心DCD信號(hào)線所處的狀態(tài)(端口的另一端是否激活或者停止)。如果用戶指定了這個(gè)標(biāo)志,則進(jìn)程將會(huì)一直處在睡眠狀態(tài),直到DCD信號(hào)線被激活。,串口使用 (2),讀寫串口 讀寫串口操作和讀寫普通文件一樣,使用read()和write()函數(shù) :,write(fd, buff, strlen(buff); read(fd, buff, BUFFER_SIZE);,接下來可恢復(fù)串口的狀態(tài)為阻塞狀態(tài),用于等待串口數(shù)據(jù)的讀入 :,接著可以測(cè)試打開文件描述符是否連接到一個(gè)終端設(shè)備,以進(jìn)一步確認(rèn)串口是否正確打開
24、 :,fcntl(fd, F_SETFL, 0);,isatty(STDIN_FILENO);,示例,閱讀代碼并運(yùn)行示例6-4-3 在宿主機(jī)上運(yùn)行寫串口的程序,而在目標(biāo)板上運(yùn)行讀串口的程序 :,int set_com_config(int fd,int baud_rate, int data_bits, char parity, int stop_bits) struct termios new_cfg,old_cfg; int speed; /*保存測(cè)試現(xiàn)有串口參數(shù)設(shè)置,在這里如果串口號(hào)等出錯(cuò),會(huì)有相關(guān)的出錯(cuò)信息*/ if (tcgetattr(fd, ,case 4800: speed =
25、 B4800; break; case 9600: speed = B9600; break; case 19200: speed = B19200; break; case 38400: speed = B38400; break;,default: case 115200: speed = B115200; break; cfsetispeed( ,/*設(shè)置奇偶校驗(yàn)位*/ switch (parity) default: case n: case N: new_cfg.c_cflag ,case s: /*as no parity*/ case S: new_cfg.c_cflag ,/*
26、設(shè)置等待時(shí)間和最小接收字符*/ new_cfg.c_ccVTIME = 0; new_cfg.c_ccVMIN = 1; /*處理未接收字符*/ tcflush(fd, TCIFLUSH); /*激活新配置*/ if(tcsetattr(fd, TCSANOW, ,/*打開串口函數(shù)*/ int open_port(int com_port) int fd; #if (COM_TYPE = GNR_COM) char *dev = /dev/ttyS0, /dev/ttyS1, /dev/ttyS2; #else char *dev = /dev/ttyUSB0, /dev/ttyUSB1, /
27、dev/ttyUSB2; #endif if (com_port MAX_COM_NUM) return -1; fd = open(devcom_port - 1, O_RDWR|O_NOCTTY|O_NDELAY); if (fd 0) perror(open serial port); return(-1); ,/*恢復(fù)串口為阻塞狀態(tài)*/ if (fcntl(fd, F_SETFL, 0) 0) perror(fcntl F_SETFLn); /*測(cè)試是否為終端設(shè)備*/ if (isatty(STDIN_FILENO) = 0) perror(standard input is not
28、a terminal device); return fd; ,int main(void) int fd; char buffBUFFER_SIZE; if(fd = open_port(TARGET_COM_PORT) 0) printf(The received words are : %s, buff); while(strncmp(buff, quit, 4); close(fd); return 0; ,/* com_reader.c */,int main(void) int fd; char buffBUFFER_SIZE; if(fd = open_port(HOST_COM
29、_PORT) 0) perror(open_port); return 1; if(set_com_config(fd, 115200, 8, N, 1) 0) fwrite(buff, 1, real_read_len, dest_file); fclose(dest_file); fclose(src_file); return 0; ,其他操作(1),字符輸入函數(shù),字符輸出函數(shù),其他操作(2),行輸入函數(shù),行輸出函數(shù),其它操作(3)-格式化輸入輸出(1),其它操作(4)-格式化輸入輸出(2),第6章 文件I/O編程,系統(tǒng)調(diào)用與用戶編程接口(API) 底層文件I/O操作 嵌入式Linux串口應(yīng)用編程 標(biāo)準(zhǔn)I/O編程 實(shí)驗(yàn),實(shí)驗(yàn)1 -文件讀寫及上鎖(1),1實(shí)驗(yàn)?zāi)康?通過編寫文件讀寫及上鎖的程序,進(jìn)一步熟悉Linux中文件I/O相關(guān)的應(yīng)用開發(fā),并且熟練掌握open()、read()、write()、fcntl()等函數(shù)的使用。 2實(shí)驗(yàn)內(nèi)容 在Linux中FIFO是一種進(jìn)程之間的管道通信機(jī)制。Linux支持完整的FIFO通信機(jī)制。 我們通過使用文件操作,仿真FIFO(先進(jìn)先出)結(jié)構(gòu)以及生產(chǎn)者-消費(fèi)者運(yùn)行模型。 本實(shí)驗(yàn)中需要打開兩個(gè)虛擬終端,分別運(yùn)行生產(chǎn)者程序
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全員A證考試考試黑鉆押題【奪冠】附答案詳解
- 2025年合肥濱湖職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試題庫有答案詳解
- 2025年廣西生態(tài)工程職業(yè)技術(shù)學(xué)院招聘筆試模擬試題含答案詳解
- 安全員A證考試自我提分評(píng)估帶答案詳解(奪分金卷)
- 安全員A證考試通關(guān)測(cè)試卷附參考答案詳解(典型題)
- 2025人保財(cái)險(xiǎn)內(nèi)蒙古分公司招聘?jìng)淇碱}庫及答案解析
- 安全員A證考試考前自測(cè)高頻考點(diǎn)模擬試題及答案詳解【名師系列】
- 安全員A證考試復(fù)習(xí)試題(考點(diǎn)提分)附答案詳解
- 2019-2024年企業(yè)文化建設(shè)方案匯編
- 學(xué)生時(shí)間管理能力提升方案
- 萬科施工管理辦法
- 2025至2030中國養(yǎng)老健康行業(yè)深度發(fā)展研究與企業(yè)投資戰(zhàn)略規(guī)劃報(bào)告
- Roland羅蘭樂器AerophoneAE-20電吹管ChineseAerophoneAE-20OwnersManual用戶手冊(cè)
- 2025年保安員資格考試題目及答案(共100題)
- 黨群工作部室部管理制度
- 2025至2030年中國兔子養(yǎng)殖行業(yè)市場(chǎng)現(xiàn)狀調(diào)查及投資方向研究報(bào)告
- 委外施工安全試題及答案
- DBT29-320-2025 天津市建筑工程消能減震隔震技術(shù)規(guī)程
- 產(chǎn)品技術(shù)維護(hù)與保養(yǎng)手冊(cè)
- 2024年國家電網(wǎng)招聘之電工類考試題庫(突破訓(xùn)練)
- 中建公司建筑機(jī)電設(shè)備安裝工程標(biāo)準(zhǔn)化施工手冊(cè)
評(píng)論
0/150
提交評(píng)論