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
となってしまいます。
直接シェルコマンドを入力するのは無理なんでしょうか?
Cの中でシェルコマンド
Re: Cの中でシェルコマンド
ソースコードを提示する際は、はBBCodeを有効にした(無効にしない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
やりたいことがよくわかりませんが、popen関数を使うといいかもしれません。taku_s さんが書きました:ユーザーIDを取得したくて
#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
となってしまいます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: Cの中でシェルコマンド
みけCATさま
失礼しました。ルールを読んでませんでした
その後、考えたんですがこれはC言語と言うよりシェルスクリプトの問題なんでしょうね
id -u のシェルコマンドは現在のユーザーIDを返しますのでこの場合ret=1000を期待したのですが
id -uは正確には標準出力に出力するものなので、returnがなければ呼び出し側へ戻り値を返さないみたいです
そこで、Cを以下に変更
次に、同じディレクトリにシェルスクリプト test.shを作成
これで、Cプログラム実行したところ
1000
ret = 232
となりました、
1000はシェルスクリプトのechoの実行結果
シェルが返す1000が数値かどうか、型が何なのかわかりませんが232って何?
失礼しました。ルールを読んでませんでした
その後、考えたんですがこれは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 ));
}
1000
ret = 232
となりました、
1000はシェルスクリプトのechoの実行結果
シェルが返す1000が数値かどうか、型が何なのかわかりませんが232って何?
Re: Cの中でシェルコマンド
232は1000の下位8ビットですね。
Linuxの終了コードは8ビットしか使えないので、上位が切り捨てられたのでしょう。
Linuxの終了コードは8ビットしか使えないので、上位が切り捨てられたのでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)