2014年2月26日水曜日

開発環境

Head First C ―頭とからだで覚えるCの基本(David Griffiths (著)、Dawn Griffiths (著) 中田 秀基(監訳)(翻訳)、木下 哲也 (翻訳)、オライリージャパン)の10章(プロセス間通信)、エクササイズ(p.447)を解いてみる。

その他参考書籍

エクササイズ(p.447)

コード(BBEdit, Emacs)

newshound2.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

void error(char *msg) {
    fprintf(stderr, "%s:%s\n", msg, strerror(errno));
    exit(1);
}

void open_url(char *url)
{
    pid_t pid = fork();
    if (pid == -1) {
        error("プロセスをフォークできません。");
    }
    if (!pid) {
        if(execlp("open", "open", url, NULL) == -1) {
            error("urlを開けません。");
        }
    }
}

int main(int argc, char *argv[])
{
    char *phrase = argv[1];
    char *vars[] = {
        "RSS_FEED=http://rss.cnn.com/rss/edition.rss",
        NULL};
    int fd[2];
    if (pipe(fd) == -1) {
        error("パイプを作成できません。");
    }
    pid_t pid = fork();
    if (pid == -1) {
        error("プロセスをフォークできません。");
    }
    if (!pid) {
        close(fd[0]);
        dup2(fd[1], 1);
        if (execle("/usr/bin/env", "/usr/bin/env", "python", "./rssgossip.py",
                "-u", phrase, NULL, vars) == -1) {
            error("スクリプトを実行できません。");
        }
    }
    dup2(fd[0], 0);
    close(fd[1]);
    char line[255];
    while (fgets(line, 255, stdin)) {
        if (line[0] == '\t') {
            open_url(line + 1);
        }
    }
    return (0);
}

Makefile

all: news_opener newshound2

news_opener: news_opener.c
 cc -g -o news_opener news_opener.c

newshound2: newshound2.c
 cc -g -o newshound2 newshound2.c

clean:
 rm news_opener newshound2

入出力結果(Terminal)

$ make
cc -g -o news_opener news_opener.c
cc -g -o newshound2 newshound2.c
$ ./newshound2 'art'
$ cat stories.txt
Oldest piece of Earth found
 http://edition.cnn.com/2014/02/24/world/oldest-earth-fragment/index.html?eref=edition
Drug cartel's growing global reach
 http://edition.cnn.com/2014/02/24/world/asia/philippines-mexico-sinaloa-cartel/index.html?eref=edition
Stop drooling: Best burgers on earth?
 http://edition.cnn.com/2014/02/12/travel/fergburger-new-zealand/index.html?eref=edition
Earth's crust
 http://edition.cnn.com/2014/02/24/world/oldest-earth-fragment/index.html?eref=edition
Sony partners with Jacko estate
 http://edition.cnn.com/2014/02/24/tech/innovation/sony-tie-up-with-michael-jackson/index.html?eref=edition
Party expels 'bulldozer' mayor 
 http://edition.cnn.com/2014/01/30/world/asia/china-mayor-explusion/index.html?eref=edition
$ ./news_opener 'art'
$

ブラウザで開けた。

0 コメント:

コメントを投稿