GCCコンパイラを使い、UNIX上のディレクトリ・ファイルの操作
また、各ファイルシステムの総容量・空容量等の確認を行いたいと思っ
ているのですが、以下の処理を実行する関数を見つけることができませ
んでした。

-----------------------------------------------------------------------------
ディレクトリの移動                  (chdir コマンド相当)
ディレクトリ内のファイル・サブディレクトリ一覧の取得 (dir/ls コマンド相当)
ファイル日付の取得                  (ls -l コマンド相当)
ディスク空き容量等確認                 (df -k コマンド相当)
ファイルの削除                    (rm  コマンド相当)
-----------------------------------------------------------------------------

もし、ご存知の方がいらっいましたら、教えて頂きたく存じます。
また、GCCを使ったUNIXシステム管理プログラミングについて、解説されている
書籍・サイト等を御存知でしたら教えていただきたく思います。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

> ディレクトリの移動                  (chdir コマンド相当)


chdir()

> ディレクトリ内のファイル・サブディレクトリ一覧の取得 (dir/ls コマンド相当)
opendir()、readdir()、closedir()

> ファイル日付の取得                  (ls -l コマンド相当)
stat()

> ディスク空き容量等確認                 (df -k コマンド相当)
知りません。popen("df -k") で代用??

> ファイルの削除                    (rm  コマンド相当)
remove()

細かい使い方は、man で参照してください。


> もし、ご存知の方がいらっいましたら、教えて頂きたく存じます。
> また、GCCを使ったUNIXシステム管理プログラミングについて、解説されている
> 書籍・サイト等を御存知でしたら教えていただきたく思います。

C 言語でシステム管理というのは、あまり聞いたことないですね。
シェルスクリプトでできないことなんですか?
    • good
    • 0

あるコマンドと同じことをやるなら、


コマンドのソースを読むのが早道かと。

LinuxでもFreeBSDでもソースがいくらでもありますから。
とうぜん、GCCでコンパイルするようになってますし。

後は,manで調べていけば。
    • good
    • 0

迷ったのですが、まだ回答が付いていないようですので・・・。


ご質問の処理はCやC++で作成しなければならないのでしょうか?
もし選択の余地があるのならシェルスクリプトではどうかと思います。
基本的にコマンド類はそのまま組み込めますし、構文とフィルタコマンドを使用すれば特定の部分を抜き出して処理させることも容易です。
弱点はインタープリタとして動作しますのでCに比べて処理速度が落ちるという点です。
重い処理をさせたり、特別速度を求めるのでなければお勧めです。

この回答への補足

natural殿の言われているようにシェルスクリプトを利用して
作成することもできそうです。
当方は、ディスク容量等を監視するシステム運用支援PGを
作成したいと考えており、シェルではなく出来ればCにて作成
したいと考えています。

natural殿、回答ありがとうございます。

補足日時:2001/08/27 16:37
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qディレクトリのパーミッションについて

ディレクトリのパーミッションについて易しく教えてください。
ディレクトリに移動するのになぜ実行アクセス権が必要なのでしょうか。仕組みがいまいち分かりません。
ファイルのパーミッションは分かるのですが、ディレクトリのパーミッションは少し分かりづらいです。
分かりやすく教えていただければうれしいです。
よろしくお願いいたします。

Aベストアンサー

> ディレクトリに移動するのになぜ実行アクセス権が必要なのでしょうか。

「x」はファイルかディレクトリかによって意味が違います。

ファイルの場合は「実行権限」でディレクトリの場合は「移動可能」です。

単に、設定箇所を流用しているだけです。

QLinuxのchdir(カレントディレクトリが移動できない)

環境はLinuxおよびcygwinです。

chdir()関数でカレントディレクトリを移動するプログラムを作成しようとしていますが、プログラムの実行後、「pwd」コマンドでカレントディレクトリを確認してもカレントディレクトリが移動されていません。

ソースコード(一部)

chdir("/home/hogehoge");

としても、カレントディレクトリは移動せず、pwdコマンドで、
/home/hogehoge
になりません。
chdir()関数はエラーを返していません。

もしくは、cdコマンドのソースコードが入手できれば、一番よいのですが・・・Linuxのカーネルやその他のソースコードを展開してもどこにあるか分かりません。

どなたかご教授お願いします。

Aベストアンサー

コマンドの種類(ビルトイン、alias、実行ファイル)は、bashの場合、type cd や type ls 等でわかります。man bash でマニュアルが出るのはご存知でしょうが、一度通読すると色々発見があるかと思います。

プログラムからカレントシェルのカレントディレクトリを変えるのは少しマジックを使うと不可能ではありません。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
main(int argc,char **argv)
{ pid_t pid_of_shell;
FILE *f;
f=fopen("/tmp/sourcefile","w");
fprintf(f,"cd %s\n",argv[1]);
fclose(f);
pid_of_shell=getppid();
kill(pid_of_shell,30);
}
必要最小限のコードなので実際には色々チェックしてください。
シェルの側では、事前に、
trap 'source /tmp/sourcefile' 30
というコマンドを実行しておきます。
上記プログラムをコンパイルして、mycd というコマンドを作り、
mycd ディレクトリ
で移動できます。
あくまで cd コマンドはカレントシェルに実行してもらわないといけません。そのため、固定のファイル名が要るのが難点ですね。/tmpじゃなくて$HOMEの下がいいかな。

コマンドの種類(ビルトイン、alias、実行ファイル)は、bashの場合、type cd や type ls 等でわかります。man bash でマニュアルが出るのはご存知でしょうが、一度通読すると色々発見があるかと思います。

プログラムからカレントシェルのカレントディレクトリを変えるのは少しマジックを使うと不可能ではありません。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
main(int argc,char **argv)
{ pid_t pid_of_shell;
FILE *f;
f=fopen("/tmp/sourcefile"...続きを読む

Qディレクトリのパーミッション(実行フラグ)について

今まで意識して考えたことが無かったのですが、ふと気づいたので質問させていただきます。

ディレクトリの実行フラグが立たないとそのディレクトリ内のファイルに対して読み書きが出来ないので、通常はパーミッションを必ず奇数にする必要があると思っていました。

これまでは意識せずそうしてきたのですが、自分の使っているVineLinuxでは/var/logのパーミッションが666となっていました。

不思議なことに!?他の一般ユーザーではアクセスすらできないlogディレクトリに、rootでは問題なくlogディレクトリへのアクセスやファイルの作成等ができました。

たしかにrootで消せなくなるファイルがあると問題になるのでrootは特別なのかもしれませんが、ディレクトリのパーミッションが666の場合どういう扱いになるのか教えていただけないでしょうか。

Aベストアンサー

Linuxにおいてrootは絶対的な存在なのでrootはすべてアクセスできます。
パーミッションについての考え方はURLを参考にしてください。

参考URL:http://www.atmarkit.co.jp/flinux/rensai/theory04/theory04b.html

QWindowsXPの MinGW,コマンドラインからのgccについて

WindowsXPの MinGW,コマンドラインからのgccについて
コンパイルエラーのログのテキストファイルへの取得方法をご教授ください。

Aベストアンサー

こういうことでしょうか?
foo.cをコンパイルする場合、

gcc foo.c 2> log

QUNIXのディレクトリのパーミッションについて

初めて質問させていただきます。

UNIXのディレクトリのパーミッションについてなのですが、
パーミッションを表す'drwxr-srwt'など、"s"や"t"のフラグが付いていているときがあります。
色々と調べてみたのですが、根本的な解決までたどり着けませんでした。
そのフラグが付いているディレクトリが意味しているものは一体何なのでしょうか?

Aベストアンサー

グループ(group)の所にある"s"がセット・グループIDビット(setgid bit/sgid bit)、その他(other)の所にある"t"がスティッキービット(sticky bit)です。
他に所有者(owner)の所にある"s"がセット・ユーザIDビット(setuid bit/suid bit)というものあります。

○セット・ユーザIDビット(setuid bit/suid bit)

実行ファイル(プログラムやコマンド、スクリプト)を実行した時、普通は実行者の権限で動作しますが、suid ビットが立っていると、実行ファイル作成者の権限で動作します。
良く使用されるのがroot権限がないと使用出来ないコマンドを一般ユーザでも使用出来るようにした時です。


○セット・グループIDビット(setgid bit/sgid bit)

あるディレクトリの所有グループが group の時、このディレクトリに sgid ビットが立っていると、その中に作成されるファイルやディレクトリの所有グループは自動的に group になり、ディレクトリには sgid ビットがセットされます。
これは、グループ内で共有ディレクトリを作成し、そこでファイルを共有した時など設定されます。


○スティッキービット(sticky bit)

ディレクトリに sticky ビットが立っていると、そのディレクトリ以下にあるファイルの削除やファイル名の変更は所有者にしか出来なくなります。
これは、テンポラリ(/tmpとか/var/tmpとか)で誰にでも書き込める領域は欲しいが、他ユーザにファイル等を消されるのを防ぎたい時などに設定されます。

なお、実行権限の部分(xの所)に権限がある時は"s"や"t"に、権限がない時には"S"や"T"になります。

グループ(group)の所にある"s"がセット・グループIDビット(setgid bit/sgid bit)、その他(other)の所にある"t"がスティッキービット(sticky bit)です。
他に所有者(owner)の所にある"s"がセット・ユーザIDビット(setuid bit/suid bit)というものあります。

○セット・ユーザIDビット(setuid bit/suid bit)

実行ファイル(プログラムやコマンド、スクリプト)を実行した時、普通は実行者の権限で動作しますが、suid ビットが立っていると、実行ファイル作成者の権限で動作します。
良く使用されるのがroot権限...続きを読む

Qlinaxでls -lコマンドを使ったとき

drwxr-xr-x 2 XXXXXX  XXXXXX 4096 Aug 4 14:16 Desktop/
-rw-r--r-- 1 XXXXXX  XXXXXX 0 Aug 4 14:47 a
-rwxr-xr-x 1 XXXXXX  XXXXXX 5373 Aug 4 14:46 a.out*
-rw-r--r-- 1 XXXXXX  XXXXXX 0 Aug 4 14:47 b
drwxr-xr-x 3 XXXXXX  XXXXXX 4096 Jul 29 23:35 lib/
-rw-r--r-- 1 XXXXXX  XXXXXX 535 Nov 22 2007 newer.c
-rw-r--r-- 1 XXXXXX  XXXXXX 534 Nov 22 2007 newer.c~
という風な出力でした。
そこで最後についている/や*や~とはどういう意味なのですか?

Aベストアンサー

*は実行可能ファイルじゃないかな
Windowsで言うところの.exeファイル
記号じゃなくて色を変える表示もありますね

Qtmpディレクトリのパーミッションを変更したい

mySQLをつなごうと思い、以下のコマンドを実行しました。

# sudo /etc/init.d/mysqld start
# mysqladmin extended-status
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/tmp/mysql.sock' exists!


/tmp/ディレクトリを見たところ、mysql.sockが作成されていませんでした。
http://www.hi-ho.ne.jp/tsumiki/book_sup2.htmlを参考にしたところ、
どうやらtmpディレクトリのパーミッションを許可すればいいようです。

調べたところパーミッションとは複雑で、ディレクトリ以下の階層の設定を考える必要や、
変更した結果いろいろと問題が発生することもあるということがわかりました。
http://www.obenri.com/_command/chmod01.html

linux初学者の私には複雑で、結局どういうコマンドを実行すればいいのかがわかりません。
/tmp/以下のディレクトリのパーミッションを許可するコマンドを教えてください。

mySQLをつなごうと思い、以下のコマンドを実行しました。

# sudo /etc/init.d/mysqld start
# mysqladmin extended-status
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/tmp/mysql.sock' exists!


/tmp/ディレクトリを見たところ、mysql.sockが作成されていませんでした。
http://www.hi-ho.ne.jp/tsumiki/book_sup2.htmlを参考にしたところ、
どうやらtmp...続きを読む

Aベストアンサー

>OSはcentOS 6です。

では、mysqlはどのように入れましたか?
ディストリビューションが用意しているパッケージ(mysql-server)だと、/var/lib/mysql/mysql.sockになるハズですが……。

ディストリビューションのパッケージの設定ファイルを変更した。
ということでしょうか?
その場合、SELinuxの設定はどうなっていますか?
# getenforceでなんと表示されます?

参考にしている書籍/サイトでソースからインストールしているから…とか、バージョンが指定されているから…とかの場合は…ハマりに陥ることもあるので注意しましょう。
# そういうものがあるのならば、どの書籍/サイトを参考にしているのか掲示された方がよいかと思われます。
# 誰かが検証してくれるかもしれませんし。

Qgccがコマンドプロンプト上で使えない(超初心者)

cygwinを取り込んで使えるようにしたんですが、コマンドプロンプト上で使えません。
コンパイルが出来ないです。
いちおう環境変数PATHを色々なHPに書いてあるように設定したのですが、gccは内部コマンド外部コマンド操作可能なプログラムパッチまたはバッチファイルとして認識されていませんと出ます。
何がおかしいのかご指摘お願いします。
あと、dirで確認したところコマンドプロンプトの初期がオーナーのドキュメントファイルに設定されているんですが、いちおうこの中にデスクトップがあるんですが、デスクトップ上でC言語プログラムの専用ファイルを作った場合にcdで飛ぶ必要はあるんですか?あるならばコマンドプロンプト上でひらがなを打つ方法を教えてください。
あと、cygwin上でコンパイルするにはどうすればいいんですか?
質問重ね重ねすいませんm(__)m

Aベストアンサー

> コマンドプロンプト上でcygwinの全ての機能が使えないと
> ありますが、大学の授業ではcmdでgccを使っていたのですが、
> なにかそれは別例ということですか?

「すべての機能が使えない」わけではなく、「すべての機能"は"使えない」です。
使えない機能があるということです。わかりにくい表現をしてしまったようで、申し訳ありません。

explorerでc:\cygwin\binを開くと、たくさんのexeとたくさんのdllとそのほかたくさんのファイルがあります。dllはbashでもcmd.exeでも直接実行できないので、除外します。
このうち、exeでないものはスクリプトです。テキストファイルで開くことができます。
これらのスクリプトは普段あまり使わないものばかりなので、それほど困りません。
exeを見ていくと、サイズが1KBになっているものが結構あります。例えばgunzip.exeやawk.exe、cc.exe、zcat.exeなどがそうです。これらはcmd.exeからは動作しません。とくにawkやgunzipは結構つかう可能性のあるコマンドなので、「なんで動かないんだ」と悩む前にbashを使え、ということになるのです。

> ホームディレクトリは標準ではc:\cygwin\home\(ユーザー名)\、
> とのことですが、そうなっていません。
> ユーザー名@フルコンピュータ名になっています。

bashを起動したら、pwdコマンドを実行してください。
/home/(ユーザー名)
と表示されませんか。
また、そのままbash上からcmd.exeを起動すると
C:\cygwin\home\(ユーザー名)>
という感じのプロンプトになると思います。
もちろん、cmd.exe上でcdコマンドを実行すると
C:\cygwin\home\(ユーザー名)
と表示されると思います。

> >しかし実のところ、(中略)よいでしょう
> この文面ですが、初心者なので理解にいたりませんでした。
> もう少し噛み砕いていただけると幸いです。

まず、ここで使う用語を整理しておきます
・ディレクトリ
explorerでいうところのフォルダをbashで見た場合の名前。/から始まる文字列であらわされます。
・ホームディレクトリ
bashを起動したときに最初に位置するディレクトリのこと。bash上でcdコマンドを引数なしで実行した場合に戻ってくる場所です。cmd.exeでのcdコマンドの機能(現在のフォルダ名を表示する)は、bash上ではpwdコマンドとして別に実装されています。
・フォルダ名
explorerやcmd.exeで見たフォルダ名。通常、ドライブレター(C:やD:など)+"\"で始まる文字列で表されます。
・ホームディレクトリのフォルダ名
bashのホームディレクトリ上でcmdを起動してcdコマンドで表示されるフォルダ名。通常C:\cygwin\home\(ユーザ名)という形になる。

では、実際にショートカットを作る方法です。
デスクトップで右クリック→新規作成→ショートカット
で表示される「ショートカットの作成」ダイアログの項目の場所として、ホームディレクトリのフォルダ名(C:\cygwin\home\(ユーザー名))を入れると、デスクトップにホームディレクトリへのショートカットができます。そのショートカットをダブルクリックで開けば、いつでもbashのホームディレクトリをexplorerで表示できます。これならwindowsでエディットしてbash上でgccを使うのが楽になります。

> cygwinのbash上でtest.cをコンパイルしようとして
> gcc -o test.c test
> を行っても、
> gcc: No such file or directory
> gcc: no input files
> と出ます。何が原因でしょうか…。

gcc -o test test.c
の間違いではありませんか。
あと、test,exeは、/bin/test.exeとして存在しますので、出力ファイル名にtestを使うのはおすすめしません。
gcc -o c_test.exe test.c
などとする方がいいでしょう。

> コマンドプロンプト上でcygwinの全ての機能が使えないと
> ありますが、大学の授業ではcmdでgccを使っていたのですが、
> なにかそれは別例ということですか?

「すべての機能が使えない」わけではなく、「すべての機能"は"使えない」です。
使えない機能があるということです。わかりにくい表現をしてしまったようで、申し訳ありません。

explorerでc:\cygwin\binを開くと、たくさんのexeとたくさんのdllとそのほかたくさんのファイルがあります。dllはbashでもcmd.exeでも直接実行できないので、除外...続きを読む

Q複数ディレクトリに共通にある同名ファイルのパーミッション変更

RHL7.3を使用しています。例えばディレクトリA,B,Cにそれぞれ「.forward」という同名のファイルが存在するとします。これらのファイルをコマンド1発でパーミッション変更ができるという話を聞いたのですが忘れてしまいました。
かすかな記憶で、chmod と find とバッククオートを組み合わせて行うというものだったと思います。どなたか教えていただけませんか。

Aベストアンサー

カレントディレクトリにあるディレクトリA,B,Cにある.forwardなら、chmod 600 {A,B,C}/.forward
カレントディレクトリにある任意のディレクトリの下の.forwardなら、chmod 600 */.forward
カレントディレクトリ下の子・孫・・・等全ディレクトリの下なら#1の回答の通りですが、もしzshをお使いならchmod 600 **/.forward とfindを使わずにシンプルに書けます。

Qunixでコマンドを実行したい。

シミュレーションの結果を取りたいのですが
膨大な量のシミュレーションを手で打つわけにはいかずに困っています。

/home/simu/simu.exe

例えば上にあるsimu.exeを120秒ごとに100回実行したい時にはどういったプログラムをつくればよいのでしょうか?

Aベストアンサー

シェルのプロンプトから以下のように打てばいいです。

for i in `seq 100`
do /home/simu/simu.exe
sleep 120
done

または、上記の内容を、simu100 というファイルに入れて、sh simu100 とやってもいいです。

1行目の ` はshift+@です。shift+7と間違えないように。


人気Q&Aランキング

おすすめ情報