質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

7256閲覧

コマンドの標準出力を配列に格納する

strike1217

総合スコア651

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/08/04 06:26

編集2017/08/04 07:58

C

1void search(){ 2 char cmdline[80]; 3 char buf[180]; 4 int i = 0; 5 6 sprintf(cmdline, "cat /proc/%d/status | grep SigBlk", getpid()); 7 printf("$ %s\n", cmdline); 8 system(cmdline); 9 10 FILE *ret = popen(cmdline, "r"); 11 fgets(buf, 180, ret); 12 printf("%s", buf); 13 pclose(ret); 14}

ん〜〜。
ところが結果が一致しません。

$ cat /proc/10161/status | grep SigBlk SigBlk: 0000000000010000 SigBlk: 0000000000000000

下の結果、シグナルセットがうまく取得できていません。
なぜでしょうか?

どこか足りませんかね??

教えてください。
Linux 64bit Debian系 gccです。

参考サイト
C言語のsystem関数などで質問です

[C言語] system関数の結果取得を簡易に行う

ファイルに一度格納するのは、実行の際に余分なファイルが生成されるので今回はパスです。

「追記」___________________________________

C

1void search(){ 2 char cmdline[80]; 3 char buf[180]; 4 int i = 0; 5 6 FILE *ret = popen(cmdline, "r"); 7 fgets(buf, 180, ret); 8 printf("%s", buf); 9 pclose(ret); 10 11 sprintf(cmdline, "cat /proc/%d/status | grep SigBlk", getpid()); 12 printf("$ %s\n", cmdline); 13 system(cmdline);

入れ替えてみると・・・結果が全く異なるものになります。

sh: 1: @4��N: not found 000000000000000000000000111111110000000000000000000000000000000000000000000000000000000000000000 $ cat /proc/18381/status | grep SigBlk SigBlk: 0000000000010000

??

ああ〜〜。
すいません。当たり前ですね。
sprintfだけは入れ替えてはいけませんね。

結果はかわりませんでした。

SigBlk: 0000000000000000 $ cat /proc/21147/status | grep SigBlk SigBlk: 0000000000010000

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

system()popen()で実行したプロセスのシグナルマスクが、実際に異なっているためです。

SYSTEM(3)にあるように、system()を実行したプロセスはSIGCHLDがブロックされます。

投稿2017/08/04 08:36

編集2017/08/04 11:10
Harahira

総合スコア243

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2017/08/04 08:59

へぇ〜〜!! そうなんですか! ではこのプログラムは問題がないということですか? system()呼び出し後はシグナルセットは元に戻るんでしょうか?
Harahira

2017/08/04 11:13

プログラム自体はttyp03さんの指摘のように問題はあると思いますが、実行結果は正しい状態を示しています。 system実行後は、SIGCHLDのブロックは元に戻ります。
strike1217

2017/08/04 11:34

わかりました。 ありがとうございます!!
guest

0

1行しか取得できないということでしょうか。
fgetsのところをループで回してみては。

c

1 char *pret; 2 3 FILE *ret = popen(cmdline, "r"); 4 for(;;){ 5 pret = fgets(buf, 180, ret); 6 if(pret == NULL) break; 7 printf("%s", buf); 8 } 9 pclose(ret);

投稿2017/08/04 07:27

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2017/08/04 07:31

最初、whileでやってみましたが、結果はかわりませんでした。 今、再度やってみましたが、かわりません。 SigBlk: 0000000000000000
ttyp03

2017/08/04 07:38

失礼しました。この処理ではループ関係ないですね。 うーん、タイミングが違うからなんでしょうかね。 上の処理と下の処理を入れ替えてみても、同じ結果になるんでしょうか。
strike1217

2017/08/04 07:43

追記いたしますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問