埋め込まれた筆記試験の面接質問 (11 日目)


序文

この記事では引き続き質問に答えます。

1. バイトストリーム、データグラム、メッセージ

1. データグラム: データグラムは、特定のサイズの独立したメッセージ単位であり、ネットワーク通信における送信の基本単位として機能します。各データグラムは独立しており、メッセージ境界と整合性があります。これには、送信元アドレス、宛先アドレス、メッセージ長などの必要な識別情報が含まれており、さまざまなネットワーク プロトコルに従ってカプセル化できます。データグラムは通常、UDP などのデータグラム指向プロトコルを介して転送されます。

2. バイト ストリーム: バイト ストリームは、一連の連続したバイト データ ストリームであり、ネットワーク通信における送信の基本単位として使用されます。バイト ストリームにはメッセージの境界や構造の概念がなく、送信用の連続したバイト シーケンスとして扱われます。バイト ストリームは通常、TCP などのバイト ストリーム指向のプロトコルを介して送信されます。バイト ストリーム送信では、データは送信のために小さなデータ セグメント (パケット) に分割され、受信側はアプリケーション プロトコルに従ってバイト ストリームを解析および処理して、元のデータ形式と意味を復元する必要があります。

3. メッセージ: メッセージは、ネットワーク通信で送信される構造とセマンティクスを備えたデータ単位です。メッセージはヘッダーとボディで構成され、ヘッダーにはメタデータ情報が含まれ、ボディにはアプリケーション層の特定のデータ内容が含まれます。メッセージの構造は、アプリケーションのニーズに基づいて事前定義、固定、または動的に決定できます。メッセージは、選択したネットワーク プロトコルと送信方法に応じて、データグラムまたはバイト ストリームとして送信できます。

主要区别如下:

1. データグラムは独立しており、メッセージ境界と整合性を持っています。バイト ストリームは、明確なメッセージ境界のない連続したバイト シーケンスです。

2. データグラムはデータグラム指向のプロトコル (UDP など) を介して送信され、バイト ストリームはバイト ストリーム指向のプロトコル (TCP など) を介して送信されます。

3. メッセージは、構造とセマンティクスを備えたデータ単位であり、データグラムまたはバイト ストリームの形式で送信できます。

2. Makefileにライブラリやモジュールを導入する方法

引入库:

Makefile にライブラリ リンク ディレクティブを追加します。Makefile のターゲット依存関係ルールで、-l パラメータを使用してライブラリの名前を指定します (例: -lmylib)。mylib はインポートするライブラリの名前です。
ライブラリの検索パスを指定します。ライブラリ ファイルがデフォルトの検索パス (/usr/lib など) にない場合は、-L パラメータを使用してライブラリ ファイルのパスを指定できます (例: -L/path)。 /to/mylib、/path/to/mylib はライブラリ ファイルへのパスです。

引入模块/头文件:

ソース ファイルで #include ディレクティブを使用してヘッダー ファイルを導入します。特定のモジュールを使用する必要があるソース ファイルで、#include ディレクティブを使用して対応するモジュールのヘッダー ファイルをインクルードします。ソースファイル内で使用できます。

3. メモリ領域を複数回解放するとどうなりますか?

1. 未定義の動作: C および C++ 言語標準によれば、同じメモリ空間で複数の解放操作を実行することは未定義の動作です。これは、コンパイラ、ランタイム システム、またはオペレーティング システムがクラッシュ、プログラムの異常終了、データ破損などを含むこの状況を任意の方法で処理できることを意味します。

2. メモリ エラーが発生する可能性があります。同じメモリを複数回解放すると、メモリ エラーが発生する可能性があります。最初の解放後、メモリ空間は使用不可としてマークされ、再び解放されたときにシステムがメモリを正しく管理できなくなり、メモリ アクセス エラーが発生したり、他のデータ構造が損傷したりする可能性があります。

3. メモリ リーク: 同じメモリを複数回フリーズすると、メモリ リークが発生する可能性があります。最初の解放後は、ポインタを明示的に NULL に設定するか、他のメモリを再割り当てしないと、そのポインタを再度使用してメモリを割り当てたり、メモリが解放されたかどうかを判断したりすることができなくなり、メモリ リークが発生します。

4. プログラム例外またはクラッシュ: メモリの同じブロックが繰り返し解放されると、プログラム例外またはクラッシュが発生する可能性があります。これは、オペレーティング システムまたはランタイム システムが無効な解放操作を検出すると、システムや他のプロセスが影響を受けないように保護するために、プログラムの実行を終了する場合があるためです。

コードテスト:

#include <stdio.h>
#include <malloc.h>


int main(void)
{
    
    
    int* p = (int*)malloc(20);

    free(p);
    free(p);

    return 0;
}


実行結果:
ここに画像の説明を挿入します
ここでは、プログラムが直接異常終了することがわかります。

4. キャラクターの操作機能が境界を越えるとどうなるのか?

1. バッファ オーバーフロー: 範囲外のアクセスによりバッファ オーバーフローが発生する可能性があります。たとえば、strcpy 関数はソース文字列の内容をターゲット文字列バッファにコピーします。ソース文字列の長さがターゲット バッファのサイズを超えると、バッファ オーバーフローが発生し、ターゲット バッファと隣接するメモリ領域が上書きされてしまいます。

2. メモリ破損: 範囲外のアクセスによりメモリ破損が発生する可能性があります。ターゲット バッファに割り当てられたメモリの範囲を超えてアクセスすると、ターゲット バッファに属さないメモリ位置が変更される可能性があります。これにより、他の変数、データ構造、または関数ポインタが破壊され、プログラムが異常に実行されたり、クラッシュしたりする可能性があります。

3. セキュリティの脆弱性: 国境を越えたアクセスは、バッファ オーバーフロー攻撃などのセキュリティの脆弱性を引き起こす可能性があります。悪意のあるユーザーは、境界外アクセスを使用してプログラムの制御フローを上書きし、リモートでのコード実行、サービス妨害、その他の攻撃を実行する可能性があります。

为避免这些问题,应该始终确保字符操作函数的输入参数符合预期,遵循正确的使用方式:

1. 文字列の終わりの識別子 ('\0') のサイズを考慮して、宛先バッファがソース文字列の内容全体を収容するのに十分な大きさであることを確認します。

2. 文字操作関数の安全なバージョン (strcpy の代わりに strncpy など) を使用します。これにより、コピーの最大長を指定して、ターゲット バッファ範囲を超えないようにすることができます。

3. 入力パラメータの有効性を慎重にチェックして、ソース文字列と宛先バッファの長さが予想どおりであることを確認し、潜在的な範囲外アクセスを回避します。

テストコード:

#include <stdio.h>
#include <string.h>


int main(void)
{
    
    
    char str[5];

    strcpy(str, "Hello World");
    

    return 0;
}


実行結果:
ここに画像の説明を挿入します

5. QT の信号を複数のスロット機能に接続できますか?

Qt のシグナルは複数のスロット関数に接続できます。Qt では、オブジェクト間の通信を実装するためにシグナル メカニズムとスロット メカニズムが使用されます。信号は複数のスロット関数に接続でき、信号がトリガーされると、接続されているすべてのスロット関数が呼び出されます。

QObject::connect() 関数を使用して、信号とスロット関数を接続できます。connect() 関数は、シグナルを送信するオブジェクトとシグナルを受信するオブジェクトの 2 つのパラメーターを受け入れます。この関数を使用して、信号をスロット関数に接続したり、信号を複数のスロット関数に接続したりできます。

以下是一个连接单个信号到多个槽函数的示例:

QObject::connect(sender, &Sender::mySignal, receiver1, &Receiver1::mySlot);
QObject::connect(sender, &Sender::mySignal, receiver2, &Receiver2::mySlot);

上記の例では、Sender オブジェクトの mySignal 信号は、2 つの異なる Receiver オブジェクト (receiver1 とReceiver2) のスロット関数 (Receiver1::mySlot と Receiver2::mySlot) に接続されています。Sender オブジェクトが mySignal シグナルをトリガーすると、両方のスロット関数が呼び出されます。

信号を複数のスロット機能に接続することで、より柔軟な信号処理とオブジェクト間の通信を実現できます。このアプローチは、Observer パターンを実装したり、同じイベントに対して複数の異なるロジックを処理したりするためによく使用されます。

6. QT の 1 つのスロット機能は複数の信号に対応できますか?

Qt では、スロット関数は複数のシグナルに対応できます。Qt のスロット関数は、複数のシグナルで同じスロット関数に接続できる通常のメンバー関数です。

QObject::connect() 関数を使用して、複数の信号を同じスロット関数に接続します。以下に例を示します。

QObject::connect(sender1, &Sender1::mySignal, receiver, &Receiver::mySlot);
QObject::connect(sender2, &Sender2::anotherSignal, receiver, &Receiver::mySlot);

上記の例では、受信者オブジェクトの mySlot スロット関数は、2 つの異なる送信者オブジェクト (sender1 と sender2) の信号 (mySignal と anotherSignal) に接続されています。送信側オブジェクトが対応する信号をトリガーすると、受信側オブジェクトの mySlot スロット関数がトリガーされます。

このメソッドを使用すると、同様のイベントまたは信号に対して同じ応答ロジックを実装でき、複数の信号を同じスロット関数に接続すると、コードがより簡潔になり、保守しやすくなります。

需要注意的是,当一个槽函数连接到多个信号时,如果信号的参数类型不同,或者信号的参数顺序不同,需要确保槽函数能够正确处理这些参数,否则可能导致运行时错误或逻辑问题。

要約する

この記事ではここで説明します。

おすすめ

転載: blog.csdn.net/m0_49476241/article/details/132291416
おすすめ