システムコールrename(2)を用いたmvコマンドの作成


unixコマンドで比較的頻繁に使用するmvコマンド。
ファイルの名前を変更したり、ディレクトリを移動させたりするのに使用します。
mvを実装するには、ファイルを移動するためのAPIであるrename(2)を使用します。

//mymv.c
#include<stdio.h>       /* fprintf, perror */
#include<stdlib.h>      /* exit */
#include<unistd.h>

int main(int argc, char * argv[])
{
        //エラー処理
        if(argc !=3){
                fprintf(stderr, "%s: wrong arguments\n", argv[0]);
                exit(1);
        }

        if(rename(argv[1], argv[2])<0){
                perror(argv[1]);
                exit(1);
                }
                exit(0);
 }

ウィンドウにtuxを表示させる

GTK+を用いたプログラミングの基本的な手法を組み合わせて
ウィンドウにtuxを表示させるプログラムを作って見ました。
ウェブアプリは簡単にさまざまなことができて確かに楽しいですが、
やはりローカル環境でスタンドアロンで動くGTK+のCプログラミングも奥が深くて面白いですね。

//showtux.c
#include<gtk/gtk.h>

// gtk_main_quit()を呼び出すコールバック関数を作成
// typedef void* gpointer
static void button_clicked(GtkWidget *button, gpointer user_data)
{
gtk_main_quit();
}

// main関数
int main(int argc, char **argv)
{

//初期化
gtk_init(&argc, &argv);

//一番の土台となるwindowウェジェットの生成及び各種設定

//windowオブジェクトの生成
GtkWidget *window;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request(window, 300, 400);

//ツールチップヒントの作成。
// typedef gchar char gchar
gchar *text;
// gchar* gstrdup(const gchar *str);
text = g_strdup("We love linux programming!!");
gtk_widget_set_tooltip_text(window, text);

//アイコンを設定する。
gtk_window_set_default_icon_from_file("./tux.png", NULL);

//以下のスコープで画像とボタンをのせるためのバッキンボックス(vbox)を作成し、
//windowウェジェットに貼り付ける
{
GtkWidget *vbox;
vbox = gtk_vbox_new(FALSE, 2);
gtk_container_add(GTK_CONTAINER(window), vbox);

//以下のスコープで画像とボタンのウェジェットを作成し、
//パッキンボックス(vbox)上に貼り付ける。
{
GtkWidget *image;
GtkWidget *button;

image = gtk_image_new_from_file("./tux.png");
//パッキンボックス(vbox)上に貼り付ける。
gtk_box_pack_start(GTK_BOX(vbox), image, TRUE, TRUE, 0);

button = gtk_button_new_with_label("Quit");
//パッキンボックス(vbox)上に貼り付ける。
gtk_box_pack_start(GTK_BOX(vbox), button , FALSE, FALSE, 0);
//ボタンに関しては、clicked動作に際して、冒頭に作成したbutton_clicked関数を
//コールバックするように設定。
//g_sginal_connect connects a GCallback function 
//    to a signal for a particular object
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(button_clicked), NULL);
}
}

//windowを閉じられた時は、gtk_main_quitが呼び出されるようにする。
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_window_set_default_icon_from_file("tux.png", NULL);

//生成したすべてのウェジェットを可視化する。
gtk_widget_show_all(window);
//メインループの開始
gtk_main();
return 0;
}








forkを用いた簡単なプログラム


プロセスを複製するためのシステムコールであるforkを用いた簡単なプログムを作りました。
大事な構文は、
if(fork() == 0){
/*child process */
} else {
/* parent process */
}
というように、if文を用いて親と子の各々の処理を記述することがあげられます。

// fork_test.c
#include<stdio.h>       /* printf */
#include<stdlib.h>      /* exit */
#include<sys/types.h>   /* fork */

int main(void)
{
        pid_t pid;
        pid = fork();
        //エラー処理
        if(pid < 0 ){
                fprintf(stderr, "fork(2) failed\n");
                exit(1);
        }
        if(pid==0){
                //子プロセスのためのコード
                printf("Hello, world from child process.\n");
                exit(0);
        }
        else{
                //親プロセスのためのコード
                printf("Hello, world from parent process.\n");
                exit(0);
        }
}

GTKでHello, world(改)

以前書いたgtkを使用したHello, worldプログラムをもう少し機能追加を行いました。
追加項目「ツールヒントの記述」「アイコン表示」の2点です。


//hello_gtk.c
#include<gtk/gtk.h>

int main(int argc, char **argv){
GtkWidget *window;

//ウィンドウウェジェットを作成。
gtk_init(&argc, &argv);
//ウィンドウウェジェットを作成。
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//ウィンドウのサイズを規程。
gtk_widget_set_size_request(window, 500, 600);
//ウィンドウのタイトルを規定する。
gtk_window_set_title(GTK_WINDOW(window), "Hello, world in GTK!!");
//カレントディレクトリに置いてあるファイルを読み込んでアイコンにする。
gtk_window_set_default_icon_from_file("./tux.png", NULL);
//ウィンドウを閉じたときの処理を規定する。
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
//ウィンドウを表示
gtk_widget_show(window);

//ツールチップヒントの作成。
gchar *text = g_strdup("Hello, world in GTK");
gtk_widget_set_tooltip_text(window, text);
        g_free(text);


//メインループ開始。
gtk_main();
return 0;
}





コマンドライン引数が指定する画像をウィンドウに表示させるプログラムです。

画像ウェジェットを作成してバッキンボックス上に張り付けてあげればOKです。


/* gtk_picutre.c */
#include<gtk/gtk.h>
#include<stdlib.h> //exit

int main(int argc, char *argv[]){

//引数のエラー処理
if(argc!=2){
g_print("Usage: %s image-file\n", argv[0]);
exit(1);
}


GtkWidget *window;

//gtk+を初期化
gtk_init(&argc, &argv);

//ウィンドウェジェットを作成
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

//ウィンドウの大きさを指定
gtk_widget_set_size_request(window, 600, 400);

//パッキンボックスを作成
GtkWidget *vbox;
vbox = gtk_vbox_new(FALSE,2);

//パッキンボックスをwindowに貼り付ける
gtk_container_add(GTK_CONTAINER(window), vbox);


//画像ウェジェットを作成
GtkWidget *image;
//コマンドライン引数が指定するファイルから画像ウェジェットを作成
image = gtk_image_new_from_file(argv[1]);
//画像ウェジェットをvboxの上半分に貼り付ける
gtk_box_pack_start(GTK_BOX(vbox), image, TRUE, TRUE, 0);

//ボタンを作成
GtkWidget *button;
button = gtk_button_new_with_label("quit");

//ボタンをクリックした時のコールバック関数を登録
g_signal_connect(G_OBJECT(button), "clicked",      G_CALLBACK(gtk_main_quit),NULL);

//buttonをvboxの下半分に貼り付ける
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE,FALSE, 0);


//ウィンドを閉じたときにプログラムを終了するようにコールバックする。
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

//ウィンドウ上のウェジェットをすべて表示(gtk_widget_show_all)
gtk_widget_show_all(window);

gtk_main();

return 0;
}


#使用例
#引数を与えないとエラーがでます
$ ./gtk_picture 
Usage: ./gtk_picture image-file

#current directoryにtux.pngという画像ファイルを置いた状態で以下のように引数をつけてプログラムを実行
$ ./gtk_picture tux.png