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
%