プロセスでのexec関数の使用について
学習プロセスで発生した問題:
- 使い方?
- 違いは何ですか?
- 役割は何ですか?
1.使い方は?
Linuxシステムでは、manコマンドを使用して以下を表示できます。
例えば:
查看man命令的使用 man man
マニュアルセクション:
The standard sections of the manual include:
1 User Commands
2 System Calls
3 C Library Functions
4 Devices and Special Files
5 File Formats and Conventions
6 Games et. Al.
7 Miscellanea
8 System Administration tools and Daemons
查看exec函数使用 man 3 exec
名前:(exec関数ファミリー全体)
execl, execlp, execle, execv, execvp - execute a file
概要:
#include <unistd.h>(头文件)
extern char **environ;
exec関数ファミリーの特定の形式:
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,
..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
2.違いは何ですか?
- 関数名が異なります(これはナンセンスです)
- パラメータが異なります
- さまざまな使用方法
ここでは、使用するこれら2つの関数を比較します:(他の関数も同様です)
- int execl(const char * path、const char * arg、…);
- int execlp(const char * file、const char * arg、…);
Linuxシステムのすべてがファイルです!!!
Linuxシステムのすべてがファイルです!!!
Linuxシステムのすべてがファイルです!!!
例:
execlpを使用する
#include<stdio.h>
#include<unistd.h>
int main ()
{
printf("==调用 execl 函数==\n");
execlp("ls","-l","/home/hadoop",(char *)0);
printf("excel error\n");
return 0;
}
execlpを使用する
#include<stdio.h>
#include<unistd.h>
int main ()
{
printf("==调用 execl 函数==\n");
execl("/bin/ls","ls","-l","/home/hadoop",(char *)0);
printf("excel error\n");
return 0;
}
実行結果を比較すると、2つの関数の実行結果は同じであることがわかりました。言い換えれば、キーは使用することであり、1つが呼ばれ、2つの関数のパラメータが異なっていることを確認することは困難ではないパスを、そして他方は、ファイル名を直接。
lsが命令ではないかどうかを尋ねる人もいますか?指示を呼び出すことはできますか?
回答:Linuxシステムのすべてがファイルです!!!
それでも疑問がある場合は、マシンに乗って実験を行うことをお勧めします。実践からの本当の知識
3.役割は何ですか?
exec関数は、プロセス内の他のプログラムのセクションを実行するように設定されています。
pid=fork();
この文は、子プロセスを作成するためのものです。その後、親プロセスと子プロセスはコードブロックを別々に実行します。
テスト:
pid=fork();
printf("Hello World!");
この文が何回出力されたかわかりますか?(自分で試してみてください!)
このことから、fork()関数が実行されると次のようなことが起こることがわかります。
親プロセスと子プロセスには違いがあるので、親プロセスと子プロセスをどのように区別できますか?
fork()関数の知識ポイント:
不需要参数并返回一个整数值。下面是fork()返回的不同值。
负值:创建子进程失败。
零: 返回到新创建的子进程。
正值:返回父母或来电者。该值包含新创建的子进程的进程ID。
だから私たちはこれを行うことができます:
pid=fork();
if(pid == 0)
{
//执行代码
}
if(pid > 0)
{
//执行代码
}
この時点で、主人公のexec関数が登場しています。この関数はコードの実行中に呼び出すことができます。
例:
1 #include<unistd.h>
2 #include<stdio.h>
3 #include<sys/types.h>
4 #include<sys/stat.h>
5 #include<stdlib.h>
6 int main()
7 {
8 int fd[2],flag;
9 flag=pipe(fd);
10 if(flag==-1)
11 {
12 printf("pipe creat error\n");
13 exit(-1);
14 }
15 pid_t pid;
16 pid=fork();
17 if(pid==0)
18 {
19 char *mess;
20 read(fd[0],mess,10);
21 printf("pid=%d\n",getpid());
22 printf("play execl:\n");
23 execl("/bin/ls","ls",mess,"/home",(char*)0);
24 printf("excel error\n");
25 }
26 if(pid>0)
27 {
28 char *message;
29 message="-l";
30 //传输参数:-l
31 write(fd[1],message,9);
32 }
33 return 0;
34 }
上記のコンテンツには名前のないパイプが含まれており、興味のある読者はそれを見つけることができます。ポイントは、子プロセスのexecl関数を確認することです。関数が正常に実行されると、24行目のprintf( "excel error \ n");ステートメントは実行されません。逆に(excelの実行に失敗しました)。実行されます。したがって、サブルーチン(excel関数の下)のコンテンツは、execl関数によって実行されるコンテンツに置き換えられます。
[root@cent0 home]# ls (目录:home 命令:ls <==> execl)
hadoop mydir (是这条语句哦!)
この声明でカバーされます。(自分で試してみてください、多分あなたはすごいでしょう、それはそれがどのようであるかです!)
以上が本日の内容ですので、皆様のお役に立てれば幸いです。
(編集者もXiaobaiから始めました。もっと質問をして、もっと勉強して、もっと仕事をしてください。そうすれば、徐々にアイデアが浮かびます!)
2019/10/26 13:31:49