計算機科学のブログ

C - プロセスとシステムサービス - 限界を超える - execle, 環境変数

Head First C ―頭とからだで覚えるCの基本David Griffiths(著)、 Dawn Griffiths(著)、 中田 秀基(監修)、 木下 哲也(翻訳)、 O’Reilly Media)の 9章(プロセスとシステムサービス - 限界を超える)、p.378(長いエクササイズ)の解答を求めてみる。

Makefile

all: main main1 main2 main3 coffee
	./main && ./main1 && ./main2 && ./main3
main: main.c
	cc main.c -o main
main1: main1.c
	cc main1.c -o main1
main2: main2.c
	cc main2.c -o main2
main3: main3.c
	cc main3.c -o main3
coffee: coffee.c
	cc coffee.c -o coffee

コード

main.c

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

int main()
{
    char *my_env[] = {"FOOD=coffee", NULL};
    // donutsとcoffee
    if (execle("./coffee", "./coffee", "donuts", NULL, my_env) == -1)
    {
        fprintf(stderr, "プロセセス0を実行できません:%s\n", strerror(errno));
        return 1;
    }
}

コード

main1.c

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

int main()
{
    char *my_env[] = {"FOOD=donuts", NULL};
    // creamとdonuts
    if (execle("./coffee", "./coffee", "cream", NULL, my_env) == -1)
    {
        fprintf(stderr, "プロセセス0を実行できません:%s\n", strerror(errno));
        return 1;
    }
}

コード

main2.c

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

int main()
{
    // coffeeとcoffee
    if (execl("./coffee", "./coffee", "coffee", NULL) == -1)
    {
        fprintf(stderr, "プロセセス0を実行できません:%s\n", strerror(errno));
        return 1;
    }
}

コード

main3.c

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

int main()
{
    char *my_env[] = {"FOOD=donuts", NULL};
    // coffeeとdounuts
    if (execle("./coffee", "coffee", NULL, my_env) == -1)
    {
        fprintf(stderr, "プロセセス0を実行できません:%s\n", strerror(errno));
        return 1;
    }
}

コード

coffee.c

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    char *w = getenv("EXTRA");
    if (!w)
    {
        w = getenv("FOOD");
    }
    if (!w)
    {
        w = argv[argc - 1];
    }
    char *c = getenv("EXTRA");
    if (!c)
    {
        c = argv[argc - 1];
    }
    printf("%sと%s\n", c, w);
}

入出力結果(Terminal, Zsh)

% make
cc main.c -o main
cc main1.c -o main1
cc main2.c -o main2
cc main3.c -o main3
cc coffee.c -o coffee
./main && ./main1 && ./main2 && ./main3
donutsとcoffee
creamとdonuts
coffeeとcoffee
coffeeとdonuts
%