8

I am learning linux programming and came across exec function which is kind of very useful. But the problem is exec function arguments are very confusing and I am unable to grasp which argument is for what purpose.. In the following code execl() function is called from a child created through fork(), What is the purpose of the last argument (NULL) in execl()?

execl("/bin/ls","ls","-l",NULL);

If any one can explain what is the purpose of NULL argument and other arguments and the purpose of arguments of exec() family function, It would be a great help to me!

4

5 に答える 5

17

未定義の動作を作成する。それは への正当な呼び出しではありませんexecl。正しい呼び出しは次のようになります。

execl( "/bin/ls", "ls", "-l", (char*)0 );

最後の引数は である必要があります。そうしないと(char*)0、動作が未定義になります。最初の引数は、実行可能ファイルのパスです。実行されたプログラムには、次の引数が表示argvされます。これらの引数のリストは(char*)0;で終了します。これが、呼び出された関数が最後の引数に到達したことを認識する方法です。たとえば、上記の例では、 at の実行可能ファイル"/bin/ls"がコードを置き換えます。そのmainには、argcequal 2、argv[0]equal "ls"、およびargv[1]equal が含まれ"-l"ます。

この関数の直後に、エラー処理コードが表示されます。(execl戻るときは常に -1 を返すので、テストする必要はありません。何らかのエラーがあった場合にのみ戻ります。)

于 2012-10-01T16:25:47.427 に答える
4

関数は可変個引数です。execコマンドに可変数の引数を渡すことができるように、可変数のパラメーターを取ります。関数NULLは、引数リストの終わりをマークするためのマーカーとして使用する必要があります。

可変個引数関数内には、可変数の引数を反復処理するループがあります。これらのループには終了条件が必要です。場合によっては、たとえばprintf、実際の引数の数は別の引数から推測できます。他の関数でNULLは、リストの終わりをマークするために使用されます。

もう1つのオプションは、引数の数に関数パラメーターを追加することですが、コードが少し脆弱になり、プログラマーは常にNULL最後の引数としてaを使用するのではなく、追加のパラメーターを管理する必要があります。

(char *) 0マーカーとしても使用されます。

execl("/bin/ls", "ls", "-l", (char *) 0);
于 2012-10-01T16:19:06.780 に答える
1

では/usr/include/libio.h、gcc 2.8 (かなり前)はnullNULLと定義されているため (はビルトイン用に予約されています)、それ以前は型が渡されないため状況と区別がつかず、if である例外が定義されています。は 0 と定義されています。NULL(void *)0(char *)0varargs__cplusplusNULL

特に 64 ビット アーキテクチャを使用している場合に安全に行うことは、任意のポインターと互換性があるように定義されている which を明示的に使用し、標準ライブラリにある可能性のある危険に(void *)0依存しないことです。#defines

于 2014-03-19T12:05:42.673 に答える