Armadilloフォーラム

system関数について

sakashita_spc

2018年8月20日 22時18分

お世話になります。現在、Armadillo 840にて、C/C++にて、ユーザーアプリケーションを開発しております。

環境は、atmark-distを利用しています。
システムの特性から、アプリケーションを2個立ち上げて、1個を/etc/inittabに登録、他方をrc.localからの起動
を行う方針で検討しております。inittabにて登録するアプリケーションはrespawnで、登録しております。

respawnに登録するアプリを作成する上で何か制約事項はありませんでしょうか?
現在、登録アプリケーションにて、system()関数を利用しており、そこから、ファイル操作のコマンド(tar,mv,curlなど)
を利用してます。このsystem()の利用は問題ないと考えていいでしょうか?
(shellが生成されないため、うまく動かないケースがあるのでは?と危惧しております。)
また、書式は
system("curl ...");
のような感じでいいでしょうか?
atmark-distではshellがashらしいので、何かashを書式に入れたほうがいいのでは?と考えたりしています。
(現在の短い評価時間では、上記の書式で問題なく動作しているようにみられれます。)
一部大幅にメモリー消費を行うアプリが動作しており、メモリーのフリー領域が少ないタイミングで
system()が呼ばれると、実行されない?ケースなどあるのでしょうか?

以上system()関数に関してアドバイスいただければと存じます。

コメント

izawa

2018年8月21日 10時38分

毎度お世話様。
Armadilloで検証したわけではないので一般論になりますが。

system()は内部で自身をfork()してからshell("/bin/sh")をexec*()してコマンド文字列をそのshellに渡します。
従って、ログインシェルを起動していないからと言って特に不都合はないと言うことになります。
# ついで言えば、waitpid()もしてくれるので確かに楽はできます。

但し、懸念を持たれたようにメモリが足りないなどの理由によって起動に失敗するケースは有り得ます。
shellの起動に失敗した場合はsystem()自体は-1を返しますが、shellがコマンドの起動に失敗した場合は
126或いは127を返します。これは起動したコマンドが126或いは127を返す場合と区別がつきません。
# 通常、そんな無粋なコマンドは余り無いと思いますが。
また、system()が0を返した場合でも起動したコマンドが終了したと言う保証はない事にも注意が必要です。
# 例えばコマンド文字列の最後に'&'が入っていると、コマンドはバックグラウンドで起動されるので終了を検出できません。
この他セキュリティの懸念もありますので、コマンド文字列には充分注意する必要があります。

sakashita_spc

2018年8月29日 0時30分

> 毎度お世話様。
> Armadilloで検証したわけではないので一般論になりますが。
>
> system()は内部で自身をfork()してからshell("/bin/sh")をexec*()してコマンド文字列をそのshellに渡します。
> 従って、ログインシェルを起動していないからと言って特に不都合はないと言うことになります。
> # ついで言えば、waitpid()もしてくれるので確かに楽はできます。
>
> 但し、懸念を持たれたようにメモリが足りないなどの理由によって起動に失敗するケースは有り得ます。
> shellの起動に失敗した場合はsystem()自体は-1を返しますが、shellがコマンドの起動に失敗した場合は
> 126或いは127を返します。これは起動したコマンドが126或いは127を返す場合と区別がつきません。
> # 通常、そんな無粋なコマンドは余り無いと思いますが。
> また、system()が0を返した場合でも起動したコマンドが終了したと言う保証はない事にも注意が必要です。
> # 例えばコマンド文字列の最後に'&'が入っていると、コマンドはバックグラウンドで起動されるので終了を検出できません。
> この他セキュリティの懸念もありますので、コマンド文字列には充分注意する必要があります。

izawa様
情報ありがとうございます。
system()関数のソースから、実際の動作を追っかけたいと思います。

もし分ければでいいのですが、本関数のソースはAtmark dist環境の
glibc/sysdeps/posix/system.c
でいいのでしょうか?

以上、よろしくお願いします。

y.nakamura

2018年8月31日 0時51分

中村です。

> system()関数のソースから、実際の動作を追っかけたいと思います。
>
> もし分ければでいいのですが、本関数のソースはAtmark dist環境の
> glibc/sysdeps/posix/system.c
> でいいのでしょうか?

atmark-distに入っているソースではなく、
debianパッケージでATDEにインストールされた
クロスコンパイル済みのものを使っていたと思います。

atmark@atde5:~$ dpkg -l | grep libc6 | grep cross
ii  libc6-armel-cross       2.13-38+deb7u10  all  Embedded GNU C Library: Shared libraries (for cross-compiling)
ii  libc6-armhf-cross       2.13-38+deb7u10  all  Embedded GNU C Library: Shared libraries (for cross-compiling)
ii  libc6-dev-armel-cross   2.13-38+deb7u10  all  Embedded GNU C Library: Development Libraries and Header Files (for cross-compiling)
ii  libc6-dev-armhf-cross   2.13-38+deb7u10  all  Embedded GNU C Library: Development Libraries and Header Files (for cross-compiling)

参考:
https://armadillo.atmark-techno.com/forum/armadillo/962

ソースはdebianのサイトにあるはずです。

--
なかむら