ページ 1 / 1
Cの中でシェルコマンド
Posted: 2016年3月30日(水) 15:43
by taku_s
Linux GNU C
Cのプログラムかた、ユーザーIDを取得したくて
#include <stdio.h>
#include <sys/wait.h>
void main(){
int ret;
ret = system("id -u");
printf("ret = %d\n", WEXITSTATUS( ret ));
}
のように書いてみたんですが、結果は
1000
ret = 0
となってしまいます。
直接シェルコマンドを入力するのは無理なんでしょうか?
Re: Cの中でシェルコマンド
Posted: 2016年3月30日(水) 16:13
by みけCAT
ソースコードを提示する際は、はBBCodeを有効にした(無効にしない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
taku_s さんが書きました:ユーザーIDを取得したくて
やりたいことがよくわかりませんが、
popen関数を使うといいかもしれません。
コード:
#define _BSD_SOURCE
#include <stdio.h>
#include <sys/wait.h>
int main(void) {
FILE* p;
int id = 0, ret = 0;
p = popen("id -u", "r");
if (p == NULL) {
perror("popen");
} else {
if (fscanf(p, "%d", &id) == 1) {
printf("id = %d\n", id);
} else {
puts("fscanf failed");
}
ret = pclose(p);
printf("ret = %d\n", WEXITSTATUS( ret ));
}
return 0;
}
taku_s さんが書きました:結果は
1000
ret = 0
となってしまいます。
期待する出力も書いてください。
Re: Cの中でシェルコマンド
Posted: 2016年3月30日(水) 21:21
by taku_s
みけCATさま
失礼しました。ルールを読んでませんでした
その後、考えたんですがこれはC言語と言うよりシェルスクリプトの問題なんでしょうね
id -u のシェルコマンドは現在のユーザーIDを返しますのでこの場合ret=1000を期待したのですが
id -uは正確には標準出力に出力するものなので、returnがなければ呼び出し側へ戻り値を返さないみたいです
そこで、Cを以下に変更
コード:
#include <stdio.h>
#include <sys/wait.h>
void main(){
int ret;
ret = system("./test.sh");
printf("ret = %d\n", WEXITSTATUS( ret ));
}
次に、同じディレクトリにシェルスクリプト test.shを作成
コード:
#!/bin/sh
ret=`id -u`
echo $ret
return $ret
これで、Cプログラム実行したところ
1000
ret = 232
となりました、
1000はシェルスクリプトのechoの実行結果
シェルが返す1000が数値かどうか、型が何なのかわかりませんが232って何?
Re: Cの中でシェルコマンド
Posted: 2016年3月30日(水) 21:27
by みけCAT
232は1000の下位8ビットですね。
Linuxの終了コードは8ビットしか使えないので、上位が切り捨てられたのでしょう。
Re: Cの中でシェルコマンド
Posted: 2016年3月31日(木) 10:25
by taku_s
みけCATさま
1000 = 0x3E8
232 = 0xE8
だったんですね。ありがとうございました。