プログラムからUNIXコマンドを呼び出す

system関数を使うとcプログラムの中からシェルコマンドを呼び出せることを知ったのでメモしておきます。

$ man -a system

#################################################################

SYSTEM(3)                                 Linux Programmer's Manual                                SYSTEM(3)

NAME
       system - execute a shell command

SYNOPSIS
       #include <stdlib.h>

       int system(const char *command);

DESCRIPTION
       system() executes a command specified in command by calling /bin/sh -c command, and returns after the
       command has been completed.  During execution of the command, SIGCHLD will be blocked, and SIGINT and
       SIGQUIT will be ignored.


#################################################################


「/bin/sh -c command」について調べてみる

$ man -a bash
#################################################################


BASH(1)                                                                                              BASH(1)

NAME
       bash - GNU Bourne-Again SHell

SYNOPSIS
       bash [options] [file]

・・・・・・・・・・・

OPTIONS
       In  addition  to  the single-character shell options documented in the description of the set builtin command, bash interprets the following options when it is invoked:

       -c string If the -c option is present, then commands are read from string.  If  there  are  arguments after the string, they are assigned to the positional parameters, starting with $0.




#################################################################


以上の情報をまとめると、system関数は/bin/sh -cを与えられた引数をつけて実行することができます。

ディレクトリのファイルを閲覧するlsコマンドを実際に呼び出してみます。

/* myls.c */
#include<stdlib.h>      /* system */

int main(void)
{
        system("ls");
        return 0;
}
/* ここまで*/

$ ./myls
errno mybash    myls    myrdir   myrmdir2 myrmdir3    rmdir.c  test.c  test1.c
errno.c  mybash.c  myls.c  myrmdir  myrmdir2.c myrmdir3.c  test     test1