組み込みの知識

確認する知識埋め込ま
1を、組み込みシステムは、一般的な構造で構成されています

ここに画像を挿入説明

2、組み込みシステムのハードウェア構成
(1)+周辺ハードウェア組み込みプロセッサ
(2)一般的な周辺ハードウエア:電源、クロック、メモリ、I / O、通信、デバッグ;
3、組み込みプロセッサ
(1)ARM 、S3C6410、STM32マイクロコントローラ、Huawei社ハスらクアルコムキンギョソウ
(2)のIntel / AMDは、プロセッサに埋め込まれていない
4、組み込みオペレーティングシステムの
機能:
タイプ:組み込みLinux、ひるみ、VxWorksの、μC/ OS-II。 アンドロイド、IOS。注:Linuxは、オペレーティングシステムを埋め込まれていません。MAC OS WINDOWS XP / 7/ 8月10日ではなく、

埋め込み知識レビュー2
-アーキテクチャ
1、ARM:ADVANCED RISCマシンは、埋め込まれたマイクロコントローラは、組み込みプロセッサの設計もベンダーです。高性能、低消費電力の組み込みプロセッサの設計。
2、ARMマイクロプロセッサの動作状態の2つの状態に対応する命令(通常)の両方
(1)Thumb状態、ARM状態;
(2)32ビットARM命令の固定長、固定長の16ビットThumb命令。
状態ARM、Thumb状態、Jazelleステート(3)ARM1176は、ARM命令、Thumb命令、のJazelle命令をサポートし、これは3つの状態を有します。
図3に示すように、異常が:
(1)プロセッサは、ユーザ命令とは異なる特定のタスクを実行するために、割り込み処理、このようなリセット、デバッグなどの、ユーザの命令を区別するために、それほど異常と呼ばれる、
1176(2)多様性と異常の種類(例):7種は(IRQ)、高速割込み(FIQ)、未定義(未定義)、データアボート(DABT)、プリフェッチアボート(pABT)、ソフト割り込みは、リセット(RESET)割り込み
4、動作モード:システムユーザモード、システムモード、割り込みモード、高速割込みモード、未定義モード、休止モード(データに対応するが、例外、プリフェッチアボートを中止)、SVC管理モード(ソフト:異なる命令が正常か異常行い、8つの異なるモードに分割されています割り込み、リセット)、SMの安全モニタモード。
5、登録:
(1)ARM 32ビット・プロセッサのレジスタである;
(2)ARM1176のレジスタの数:40
を含む(3)ARM1176レジスタ;グループ化されていないレジスタは、SPSR、CPSR、レジスタバンク
((4)グループ化されていないレジスタすべてのコモン・モード):9、R0〜R7、R15(PC )
特別(異なる動作モード(5)パケットレジスタ、わずかに異なるの異なるモード):
R8〜R14①、
②6の異なるモードでSPSRレジスタ:spsr_IRQを、SPSR_fiq、SPSR_abt、
SPSR_und、SPSR_svcにおいて、SPSR_mon
(6)再利用可能なレジスタ:
①SPスタック・ポインタ・レジスタ-R13、サブルーチンコールまたは異常保持します一時的なデータを処理し;
;②は、メインプログラムを回復するように、サブルーチン呼び出しや例外、メインルーチンコール命令/ジャンプ命令の次の命令の割り込みエントリアドレスを処理し保存するために、-R14登録LRを接続する
③PCプログラムカウンタ-P15は、命令を記憶するためのアドレスを実行します。
(7)PSRプログラムステータスレジスタを:
①CPSRカレントプログラムステータスレジスタを備え、バックアッププログラムのステータスがSPSRを登録、
②CPSPプロセッサモード、電流モードの状態を保存し、終了ビットパターン情報の有効化、条件およびサイズを中断。
異常が発生する前に、CPSRバックアップ用③SPSR値は、ユーザは、例外処理の終了時にプログラム状態に戻ることができます。
。6、2つの割り込みARMをサポート:IRQおよびFIQを
図7に示すように、ARMデータ格納形式:ビッグエンディアン(ビッグエンディアン)と小端(リトルエンディアン)
:8、ARM RISCマイクロプロセッサ・アーキテクチャは、典型的には、以下の特性を有している
 
、小容量①を低電力、低コスト、高性能;
、8/16ビットデバイスとの相溶性②親指をサポート(16ビット)/ ARM(32ビット)デュアル命令セット;
③多数のレジスタを使用して、命令実行速いです。
④ほとんどのデータ操作は、レジスタに完了し、
⑤柔軟かつ簡単なアドレッシングモードは、高効率を、
⑥固定長命令。
⑦命令は、条件付き実行をサポートしています。
⑧・アクセス・メモリは、ロード/ストアの実装を使用しました。

組み込みの知識のレビュー3
用-arm-LINUX組み込み開発環境
クロス開発モデル
1、構造物の組成
(1)ホスト:ホストの開発、通常PC、Linuxディストリビューションシステム、開発ツール(ローカルおよびクロスコンパイラ)(コードエディタViと、コンパイラGCC、デバッガGDB、プロジェクトマネージャMAKE、NFSなど)の組成物;
(2)ターゲット・マシン:組込みシステム、一般ARMハードウェアブートローダ、カーネル、ルートファイルシステムから成り;
(3)接続キット:シリアルケーブル、ネットワークケーブル、USBケーブルなど。
2は、類似点と相違点コンパイラツールチェーンとクロスコンパイラツールチェーンを理解するために
、(1)同じ点:
①サポートされる言語用にコンパイルし、同じリンクおよびデバッグ、コンパイラの使用は、
②通常、コンパイラ、リンカ、デバッガを有していますライブラリや他のバイナリツールが形成されます。
(2)の違い:
;①コンパイラツールチェーンは、一般的にネイティブ・コンパイル、ネイティブ実行モデルの開発のために使用される
クロスコンパイル・モードを動作のホスト、ターゲットを開発するための②クロスコンパイラツールチェーン、
③一般的にコンパイラLinuxディストリビューションgccのコマンドへの直接呼び出しが装備されています。
④クロスコンパイラは、一般的に、ホストのハードウェアおよびソフトウェア環境に基づいて、目標とカスタマイズのためのgcc、関連ライブラリ、ツールが。
主鎖クロスコンパイラアームのLinux-GCC、腕- ⑤OK6410開発ボード実験室カスタムコンパイラ32、 Linuxの-G ++アームのLinux-GDB などが挙げられます。
第二に、開発ツールの使用方法
1、Viの動作モードとスイッチ-一般的なキー操作を保存して終了し、Viの完全なソースコード編集の使用を習得。
2、GCC:GNUコンパイラコレクション、 GUN コンパイラスイートの機能:
①高レベルの言語コンパイラの大半をサポートし、従来のC / C ++、Fortan、目的の両方をサポート -Cを、 また、JavaやPython、行くと他の言語をサポートしています。
②支持アセンブリ言語、
③最も主流のプロセッサ・プラットフォームをサポートしています。
④クロスコンパイラツールチェーンを構築しやすいです。
3、GCC /アームlinux- GCC 使用方法:
①基本的な使い方:GCCのhello.c、アームlinux- GCCのhello.c、 出力a.outの
②推奨される使用法:GCCのhello.c -oハロー/腕- LinuxベースのGCC hello.c -oこんにちは、あなたは、出力ファイル名を指定することができます。
③主な翻訳パラメータは、
すべてのアラーム情報を印刷-Wall;
-O {0-3、コードの最適化支援S}、0最適化なし、
-gのgdbデバッガのサポート、
-lpthreadをマルチスレッドをサポートしています。

4、作り、Makefileの
(1)メイク:プロジェクトマネージャは、プロジェクト管理(など、クリーニング、アンロード、インストール、ミラーリング技術を生成、コンパイル、リンク)のMakefileを実現の実装を使用する;
(2)メイク用法:ターミナルで、Makefileを書きますmakeコマンドを実行します。
(3)Makefileの例準備:
プロジェクト、2つのソースファイルのtesta.c、testb.c、ヘッダファイルtestb.h、アームのLinux-GCCコンパイラ、テストのために得られた実行可能ファイルを、コードがサポートする必要がありますMakefileには次のように他のコンパイラオプションのデバッグ、最適化、印刷警告情報、サポートGDBは:
SRCはtestb.h testa.testb BC =
Execのテスト=
CC = ARM-Linuxの-gccの
CFLAGS = -g -Wall -O2
E バツ E C (EXEC): (SRC)
$(CC)$(SRC)-o $(EXEC)$(CFLAGS)

組み込みの知識のレビュー4
-arm-Linuxのプログラミング文書
1、Linuxのファイルプログラミングの概要
(1)ファイルディスクリプタ:4つのタイプに分け、Linuxのファイル:これらのファイルを区別するために、通常のファイル、ディレクトリ、ファイル、リンク、ファイル、デバイスファイルでしょう「ファイルディスクリプタ」を理解し、
ファイルディスクリプタは非負の整数である、彼はカーネルプロセスごとのオープンファイルテーブルレコードへのインデックス値、およびポイントです。既存のファイルを開くか、新しいファイルを作成すると、カーネルは、ファイルを読み取り/書き込みする必要がある場合、プロセスへのファイル記述子を返しますが、また、パラメータとして適切な関数に渡された記述子を提出する必要があります。
(2)基本的なI / O操作
Linuxの入力/出力(I / O)操作は、通常、5つの領域:オープン、読み取り、書き込み、およびクローズ
5は、対応するシステムコール:
オープン、読み取り、書き込みを、閉じる、のlseek
必要なヘッダファイル:
の#include <SYS / types.h>に
する#include <unistd.h>
1.open関数を
次のようにオープン関数であるプロトタイプ:
INTオープン(CONSTチャー*パス名、フラグINTモードmode_t)
関数:渡すパラメータは以下の通りである
パス名:ファイルの名前を表す文字列が開かれ、パスを含んでいてもよいです。
フラグ:使用されるテーブルフラグに示すように、1つの以上のフラグファイルを示すが、開放される:
O_RDONLY読み取り専用の
O_WRONLYのみオープン書き込み
O_RDWR読み取り/書き込みモードの開口部を
O_CREATファイルが存在しない場合は、新しいファイルの作成
O_EXCLファイルはあなたがO_CREATを使用する場合、エラーメッセージを返すことができますが存在する
ファイルがすでに存在している場合O_TRUNCを、そして読み取り専用または書き込み専用その後、任意の元のデータのファイルをすべて削除し、正常に開かれ
O_APPENDファイルの末尾にファイルポインタ、同時にファイルを開く、ファイルを開くために追加
「|」機能を開いて、flagsパラメータを使用することができます組み合わせ、O_RDONLY、O_WRONLY、O_RDWRこれらの3つの方法が相互に排他的です。注、それは同時に使用することはできませんので、この引数は3つだけを表示することができます。

オープンアクセスモードは、ファイルモードはシンボリック定数を使用することができる、新規ファイルのオクタルパーミッションを表すために使用することができるされては<sys / stat.h>定義され、このパラメータは無視され、既存のファイルのオープン、関数戻り値は:、ファイルディスクリプタが成功したエラーリターンが-1を返します。

ファイルモードシンボリック定数:
S_IRWXU 00700読み取り、ユーザーが属しています。書き込み、および実行権限の
S_IRUSRの00400は、ユーザーがアクセス読み属する
S_IWUSRの00200は、ユーザーの書き込み権限に属する
00100ユーザーがパーミッションが所属実行S_IXUSR

権限、読み取り、書き込み、および実行するユーザーのS_IRWXG 00070グループ
S_IRGRP 00040読み取り、ユーザーグループの権限 
S_IWGRP 00020ユーザーグループ書き込み権限
ユーザーのS_IXGRP 00010グループは実行権限を

S_IRWXO 00007他のユーザーが、読み取り、書き込み、およびアクセス許可を実行する
S_IROTH 00004他のユーザーがアクセスの読み取り
00002他のユーザーがアクセス権の書き込みS_IWOTHを
00001他のユーザーがアクセス権実行S_IXOTHを
2.read機能をと書き
、次のように関数のプロトタイプを
読む(int型FD、無効* bufは、size_tのCOUNT ssize_tの)
ssize_tの書き込み(int型FD、CONSTのvoid * bufを、size_tの数)
の関数を渡すパラメータは次のとおりです。
FDのファイルディスクリプタ
のみ指定メモリデータバッファbuf
カウントはバイト数を指定する読み取りまたは書き込み
3.close機能
する場合あなたはファイルを閉じ近く終了するファイルを使用することができ、データはディスクへのバッファを閉じ、ファイルによって占有され、最大の無料リソースには、次のプロトタイプを閉じる:
int型に近い(int型FD)
機能を渡すパラメータを:FDファイルディスクリプタを
関数の戻り値は:ファイルが正常に0が返された閉じた場合は、エラーが発生し-1を返して、errnoを設定し、閉じたとき、通常はエラーを提出することは一般的ではありませんが、不可能ではない状況で、彼は、ネットワークを介して近くのアクセスではなかったですこれは、ときにファイルを発生することがあります。
4.lseek機能
拡張ファイルとファイルサイズ(第1の割り当て空間、及び次いで充填コンテンツ)を取得するために使用される主ファイル読み取りおよび書き込みポインタを移動させるため、次の関数プロトタイプ:
off_t型のlseekの(off_tではのINT FDは、そこINT、オフセット)
パラメータは、fdが:ファイルディスクリプタを。
オフセット:オフセットは、各書き込み動作(前進し、後退)正または負のいずれか、バイト数単位の移動距離を必要と
そこから
(BP現在位置):SEEK_SET:ファイルの現在位置当初、オフセットの大きさのための新しい場所。
SEEK_CUR:ファイルポインタの位置の現在位置、新しい位置に加えて、現在位置のオフセット。
SEEK_END:ファイルの最後の現在位置、ファイルのサイズとオフセットの大きさのための新しい場所。
戻り値成功:現在の変位のファイル
-1:エラー

組み込みの知識のレビュー5
-arm-linuxのプログラミングプロセス
A、Linuxのプログラミングプロセスの
過程(プロセス)は、オペレーティング・システムに関するデータ収集活動上で実行するコンピュータプログラムは、リソースの割り当てとスケジューリング、操作の基本単位がされています基本的なシステムアーキテクチャ。
1つのプロセス制御
で作成された子プロセス:フォーク()関数がある
Linuxでの新しいプロセスを作成するための唯一の方法は、フォーク()関数を使用することです。Linuxでのフォーク()関数は、非常に重要な機能であり、過去に機能がフォーク()関数は、それは2つの値を返す実行時間が見えるので、いくつかの違いが、ありますが発生しました。
1)フォーク()関数説明
フォーク()関数は、既存のプロセスから新規プロセスを作成するために使用されます。新しいプロセスは子プロセスと呼ばれ、元のプロセスは、親プロセスと呼ばれています。
子プロセスを取得するためにフォーク()関数を使用すると、親プロセスのコピーである、それはプロセスのコンテキストを含む全体のプロセスの親プロセスのアドレス空間、コードセグメント、プロセス・スタック、メモリ情報、開いているファイルディスクリプタを継承しますプロセスの優先順位、プロセスグループ番号、現在の作業ディレクトリは、ルートディレクトリ、リソースの制限、および制御端子、一方子プロセス、リソース利用とタイマーとしてのみ独自のプロセスIDを、制御設定に署名。
子プロセスは親プロセスのほぼ完全なコピーであるため、プロセスは、父と息子の両方が同じプログラムを実行されるため。道のためのこの必要性は、それ以外の場合は、2つのプロセスが異なることを行うことができない、それらを区別し、それらが同一の実行を行うようにします。
実際に親プロセス()関数ではフォークで、親プロセスは子プロセス、親と子を複製し、二つのプロセスように、フォークからコード()関数は、2つのアドレス空間で各実行の開始を返しますそれぞれ()関数をフォークに属する値は、子プロセスの親プロセスIDである戻り値を返し、子プロセスは0を返します。したがって、親プロセスや子プロセスの戻り値を決定することが可能です。
2)フォーク()関数のシンタックス

プロセスが関数待機
子プロセスが終了するまで1)待機()関数、無条件待機、親プロセスブロック

2)のwaitpid()関数は、終了するの子プロセスのために待機し、どのようにブロックまたは非ブロック(待つこと)を指定する
必要なヘッダファイルは、<SYS / types.h>に#includeする
の#include <SYS / wait.h>
(waitpidのpid_t関数プロトタイプをpid_t pidを、int型*ステータス、int型のオプション)
引数のpid pid>は0:プロセスIDだけを待つことは限り指定された子プロセスが終わっていないとして、waitpidの意志、終わりが不足してきたにかかわらず、他のサブプロセスの子プロセスのPIDに等しいです永遠に待ちます。
PID = -1:この時点では、すべての子プロセスが終了するために同じ役割を待って待ちます。
PID = 0:そのグループIDのいずれかの子プロセスグループIDを待つ呼び出し元のプロセスと同じです。
PID <-1:IDは、任意のサブプロセスpidの絶対値に等しいグループ待ちます。
待つとステータス
オプションWNOHANG:pidで指定された子プロセスがブロックされていないwaitpidを、すぐに利用できない場合、戻り値は0です
WUNTRACEDは:実装は任意のサブ状態のプロセスのpidで指定されたジョブの制御を、サポートしている場合は中断されましたそしてその状態が一時停止するので、そのステータスが返され報告されていません。
0:同じ待ち、親プロセスをブロックすることは、子プロセスが終了するのを待ちます。
通常の関数の戻り値:子プロセスのプロセスIDが終了
オプションWNOHANGとし、終了していない場合、子プロセス:0
コールエラー:-1

終了()と_exit():プロセスの終了
に必要なヘッダファイルを終了します。#include <stdlib.h>に含ま
_exitます。#include <unistd.h>
関数のプロトタイプを終了します。void終了(INTステータス);
_exitます:void _exit(int型ステータス);
関数は、このパラメータは、プロセスの終了時に透過状態を利用することができる、状態パラメータの整数値が渡されます。
0は、通常、正常終了を示し、他の値はエラーを示す、プロセスが異常終了します。
実際のプログラムでは、戻り値は、対応する、受信待機システムの子プロセスによって呼び出すことができる
プロセス。

両者の差:
(1)_exit()関数は、最も簡単に戻します、プロセスの終了を指示することが利用するメモリ空間をオフにして、カーネル内のその様々なデータ構造を破壊すること;
(2)終了()関数であります私たちは、プロセスの数を実行する前に終了して、これらの基盤の上にいくつかのパッケージを作りました。
ファイルをチェックするには、exitシステムコールを呼び出す前に(3)の出口()関数は、ファイルバッファの内容がファイルである書き込み、開かれた「I / Oバッファのクリーンアップ。」
Linuxでのプロセス間通信
の通信機能を実現するためのプロセス間通信及び送信パラメータ、Linuxの通信をサポートするプロセス間に一般的に使用される方法:パイプ、メッセージキュー、共有メモリ、セマフォなどソケット。

埋め込まれた知識のレビューは、6つの
プログラミング-arm-Linuxネットワーク
プログラムプロセスは、
(1)プログラムは、通信ネットワークアーキテクチャ-クライアント/サーバ・アーキテクチャは、
(2)以下の流れ:
ここに画像を挿入説明
TCP通信を

2、函数说明
socket()
Sockfd=socket(AF_INET,SOCK_STREAM,0);

Bind()
s_add.sin_family=AF_INET;IPV4协议
s_add.sin_addr.s_addr=inet_addr(“192.168.1.123”);IP地址192.168.1.123
s_add.sin_port=htons(0x8888);端口号是8888

if(-1 == bind(Sockfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))

listen()服务器端侦听函数
listen(Sockfd,5)服务器侦听来自客户端的请求
accept()服务器端接受客户端连接请求
nfp = accept(Sockfd, (struct sockaddr *)(&c_add), sizeof(struct sockaddr);

send()数据发送函数
send(nfp,“hello,welcome to my server”,32,0)
recv()数据接收函数
recv(nfp,buffer,1024,0)
关闭连接
Close(nfp)
关闭服务器
Close(Sockfd)

嵌入式知识点复习七
–linux字符型设备驱动初步
一、Linux字符设备驱动初步
1、Linux设备类型
(1)字符设备:只能一个字节一个字节的读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后顺序进行。字符设备是面向流的设备,常见的字符设备如鼠标、键盘、串口、控制台、LED等。
(2)块设备:是指可以从设备的任意位置读取一定长度的数据设备。块设备如硬盘、磁盘、U盘和SD卡等存储设备。
(3)网络设备:网络设备比较特殊,不在是对文件进行操作,而是由专门的网络接口来实现。应用程序不能直接访问网络设备驱动程序。在/dev目录下也没有文件来表示网络设备。

2、开发流程
ここに画像を挿入説明
3、关键函数讲解(以2.6以下版本内核为例)
(1)驱动模块注册register_chrdev()函数
原型:register_chrdev(unsigned int major, const char *name,const struct file_operations *fops);
major:主设备号,该值为 0 时,自动运行分配。而实际值不是 0 ;
name:设备名称;
fops:操作函数,实现驱动定义的open、read、write、close等内核函数与应用程序调用的open、read、write、close间的映射;
返回值:
major 值为 0 ,正常注册后,返回分配的主设备号。如果分配失败,返回 EBUSY 的负值 ( -EBUSY ) 。major 值若大于 linux/major.h (2.4内核)中声明的最大值 (#define MAX_CHRDEV 255) ,则返回EINVAL 的负值 (-EINVAL) 。指定 major 值后,若有注册的设备,返回 EBUSY 的负值 (-EBUSY)。若正常注册,则返回 0 值
(2)驱动注销unregister_chrdev()函数
原型:
#include <linux.fs.h>
int unregister_chrdev (unsigned int major, const char *name)
变量:
major 主设备号
name 设备文件
返回值:
major 值若大于 linux/major.h (2.4 内核)中声明的最大值 (#define MAX_CHRDEV 255),返回 EINVAL的负值 (-EINVAL)。指定了 major的值后,若将要注销的 major 值并不是注册的设备驱动程序,返回 EINVAL的负值 ( -EINVAL )。正常注销则返回 0值。
(3)File_operation结构体
file_operations结构是建立驱动程序和设备编号的连接,内部是一组函数指针,每个打开的文件,也就是file结构,和一组函数关联,这些操作主要用来实现系统调用的
struct file_operations {
  struct module *owner;//拥有该结构的模块的指针,一般为THIS_MODULES
loff_t (*llseek) (struct file *, loff_t, int);//用来修改文件当前的读写位置
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);//从设备中同步读取数据
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);//向设备发送数据
ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);//初始化一个异步的读取操作
ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);//初始化一个异步的写入操作
  int (*readdir) (struct file *, void *, filldir_t);//仅用于读取目录,对于设备文件,该字段为NULL
unsigned int (*poll) (struct file *, struct poll_table_struct *); //轮询函数,判断目前是否可以进行非阻塞的读写或写入
  int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); //执行设备I/O控制命令
  long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); //不使用BLK文件系统,将使用此种函数指针代替ioctl
  long (*compat_ioctl) (struct file *, unsigned int, unsigned long); //在64位系统上,32位的ioctl调用将使用此函数指针代替
  int (*mmap) (struct file *, struct vm_area_struct *); //用于请求将设备内存映射到进程地址空间
  int (*open) (struct inode *, struct file *); //打开
  int (*flush) (struct file *, fl_owner_t id);
  int (*release) (struct inode *, struct file *); //关闭
  int (*fsync) (struct file *, struct dentry *, int datasync); //刷新待处理的数据
  int (*aio_fsync) (struct kiocb *, int datasync); //异步刷新待处理的数据
  int (*fasync) (int, struct file *, int); //通知设备FASYNC标志发生变化
  int (*lock) (struct file *, int, struct file_lock *);
  ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
  unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
  int (*check_flags)(int);
  int (*flock) (struct file *, int, struct file_lock *);
  ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
  ssize_tの(* splice_read)(構造体pipe_inode_info構造体ファイル*、loff_tの*、*、size_t型、unsigned int型);
  int型(* setlease)(構造体ファイル*、長い、構造体file_lock **)。
}。

おすすめ

転載: blog.csdn.net/weixin_44039347/article/details/91606727