Cの中でシェルコマンド

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
taku_s
記事: 11
登録日時: 9年前

Cの中でシェルコマンド

#1

投稿記事 by taku_s » 9年前

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
となってしまいます。

直接シェルコマンドを入力するのは無理なんでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: Cの中でシェルコマンド

#2

投稿記事 by みけCAT » 9年前

ソースコードを提示する際は、は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
となってしまいます。
期待する出力も書いてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

taku_s
記事: 11
登録日時: 9年前

Re: Cの中でシェルコマンド

#3

投稿記事 by taku_s » 9年前

みけ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って何?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: Cの中でシェルコマンド

#4

投稿記事 by みけCAT » 9年前

232は1000の下位8ビットですね。
Linuxの終了コードは8ビットしか使えないので、上位が切り捨てられたのでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

taku_s
記事: 11
登録日時: 9年前

Re: Cの中でシェルコマンド

#5

投稿記事 by taku_s » 9年前

みけCATさま

1000 = 0x3E8
232 = 0xE8
だったんですね。ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る