ページ 11

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
だったんですね。ありがとうございました。