exec系

exec系は主にプロセスの置換を行います.
プログラムの中から別のプロセスを起動するときに使われます. 新しく起動されたプログラムは, 元のプログラムを置き換えを行う.

                        #include<unistd.h>
extern char **environ;
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[]);
int execve(const char *file, char *const argv[], char *const envp[]);
                        
ちなみに, この中でシステムコールであるのはexecveである。


execl example

/* execl.c */

#include<stdio.h>
#include<unistd.h>

int main(int argc, char **argv)
{
    printf("First Process Start...\n");

    execl("/bin/echo", "echo", "Confirmation.", NULL);
    /* 第1引数は実行するプログラムのパス */
    /* 第2引数以下はコマンド名を含め, コマンドラインに渡す引数を指定 */
    /* 最後に引数の終わりを示す文字(NULL)へのポインタ */

    /* 上書きされるためここまではこない */
    printf("Test\n");

    return 0;
}
                            
実行例

$ ./execl
First Process Start...
Confirmation.

execl系の上書きを確認する.
/* result.c */

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main(int argc, char **argv)
{
    printf("First Process...(PID:%d)\n", getpid());
    printf("Please Any Key...\n");
    getchar();

    execl("/bin/less", "less", "/usr/include/stdio.h", NULL);

    return 0;
}
                            

$ ./result.c First Process...(PID:4775)
Please Any Key... ---- Enterを入力
---- lessコマンド起動中にCtrl-Zで停止させる.----
[1]+ 停止     ./result
$ ps
 PID TTY TIME CMD
...
4775 pts/2 00:00:00 less
....

上記は実行例であり, PIDの値は常に変動します.
コマンドを再開させるにはfgコマンドを使用してください.