{"id":26800,"date":"2015-01-19T17:59:51","date_gmt":"2015-01-19T08:59:51","guid":{"rendered":"http:\/\/www.softantenna.com\/wp\/?p=26800"},"modified":"2015-01-19T17:59:51","modified_gmt":"2015-01-19T08:59:51","slug":"write-a-shell-in-c","status":"publish","type":"post","link":"https:\/\/softantenna.com\/blog\/write-a-shell-in-c\/","title":{"rendered":"\u30b7\u30f3\u30d7\u30eb\u306aUNIX Shell\u3092C\u3067\u5b9f\u88c5\u3059\u308b\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u300cWrite a Shell in C\u300d"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/softantenna.com\/blog\/wp-content\/uploads\/2015\/01\/Icommand2.png\" alt=\"Command\" title=\"command.png\" border=\"0\" width=\"546\" height=\"472\" \/><\/p>\n<p>UNIX\u3067\u6b20\u304b\u3059\u3053\u3068\u304c\u3067\u304d\u306a\u3044\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u4e00\u3064\u306b\u300c\u30b7\u30a7\u30eb\u300d\u304c\u6319\u3052\u3089\u308c\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002\u30b7\u30a7\u30eb\u306f\u30e6\u30fc\u30b6\u30fc\u306e\u30b3\u30de\u30f3\u30c9\u5165\u529b\u3092\u53d7\u3051\u53d6\u3063\u3066\u6307\u793a\u3092OS\u306b\u4f1d\u3048\u305f\u308a\u3001\u7d50\u679c\u3092\u753b\u9762\u306b\u8868\u793a\u3057\u305f\u308a\u3001\u3068\u3044\u3063\u305f\u5927\u5207\u3084\u5f79\u5272\u3092\u62c5\u3063\u3066\u3044\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u3059\u3002<\/p>\n<p>\u3053\u306e\u30b7\u30a7\u30eb\u3092\u5b9f\u969b\u306bC\u8a00\u8a9e\u3067\u4f5c\u6210\u3059\u308b\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u300c<a href=\"https:\/\/github.com\/brenns10\/lsh\/tree\/9f2b98a74992f2837903f0ed91f4c6cb69784ab4\">Write a Shell in C<\/a>\u300d\u304c\u516c\u958b\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u30b7\u30a7\u30eb\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3068\u3044\u3046\u3068\u3001\u3068\u3066\u3082\u8907\u96d1\u306a\u30a4\u30e1\u30fc\u30b8\u3092\u6301\u3063\u3066\u3057\u307e\u3044\u307e\u3059\u304c\u3001\u3053\u306e\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u3067\u4f5c\u6210\u3059\u308b\u30b7\u30a7\u30eb\u300c<a href=\"https:\/\/github.com\/brenns10\/lsh\">lsh<\/a>\u300d\u306f\u30b3\u30e1\u30f3\u30c8\u8fbc\u307f\u3067<a href=\"https:\/\/github.com\/brenns10\/lsh\/blob\/master\/src\/main.c\">267\u884c<\/a>\u3057\u304b\u306a\u3044<span class=\"mybold\">\u8d85\u30b3\u30f3\u30d1\u30af\u30c8<\/span>\u306a\u3082\u306e\u3067\u3059\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/softantenna.com\/blog\/wp-content\/uploads\/2015\/01\/Imain.c.png\" alt=\"Main c\" title=\"main.c.png\" border=\"0\" width=\"546\" height=\"235\" \/><\/p>\n<p>bash\u3084zsh\u3068\u3044\u3063\u305f\u6709\u540d\u30b7\u30a7\u30eb\u306f\u3068\u3066\u3082\u8907\u96d1\u306a\u4f5c\u308a\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u304c\u3001\u3053\u308c\u304f\u3089\u3044\u306e\u30b5\u30a4\u30ba\u306a\u3089\u7406\u89e3\u3067\u304d\u305d\u3046\u3067\u3059\u306d\u3002<\/p>\n<p><!--more--><\/p>\n<h3>UNIX\u306e\u4ed5\u7d44\u307f\u304c\u5206\u304b\u308b\u304b\u3082<\/h3>\n<p>\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u306f\u3001\u30b7\u30a7\u30eb\u306e\u30e9\u30a4\u30d5\u30bf\u30a4\u30e0\u306e\u8aac\u660e\u304b\u3089\u59cb\u307e\u308a\u3001\u30e1\u30a4\u30f3\u30eb\u30fc\u30d7\u306e\u4e2d\u3067\u5165\u529b\u884c\u3092\u8aad\u307f\u53d6\u3063\u3066\u89e3\u6790\u3059\u308b\u65b9\u6cd5\u3001\u3055\u3089\u306b\u5916\u90e8\u30b3\u30de\u30f3\u30c9\u3084\u7d44\u307f\u8fbc\u307f\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b\u65b9\u6cd5\u3078\u89e3\u8aac\u304c\u9032\u3093\u3067\u3044\u304d\u307e\u3059\u3002<\/p>\n<pre><code class=\"c\">int lsh_launch(char **args)\n{\n  pid_t pid, wpid;\n  int status;\n\n  pid = fork();\n  if (pid == 0) {\n    \/\/ Child process\n    if (execvp(args[0], args) == -1) {\n      perror(\"lsh\");\n    }\n    exit(EXIT_FAILURE);\n  } else if (pid < 0) {\n    \/\/ Error forking\n    perror(\"lsh\");\n  } else {\n    \/\/ Parent process\n    do {\n      wpid = waitpid(pid, &status, WUNTRACED);\n    } while (!WIFEXITED(status) && !WIFSIGNALED(status));\n  }\n\n  return 1;\n}\n\n<\/code><\/pre>\n<p>\u7279\u306bexec()\u3084fork()\u3068\u3044\u3063\u305f\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3092\u4f7f\u3063\u3066\u5916\u90e8\u30b3\u30de\u30f3\u30c9\u3092\u547c\u3073\u51fa\u3059\u65b9\u6cd5\u304c\u7406\u89e3\u3067\u304d\u308c\u3070\u3001UNIX\u306e\u30d7\u30ed\u30bb\u30b9\u30e2\u30c7\u30eb\u306b\u95a2\u3059\u308b\u77e5\u8b58\u3092\u4e00\u5c64\u6df1\u3081\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u3067\u3057\u3087\u3046\u3002<\/p>\n<h3>\u304a\u307e\u3051: lsh\u306e\u5b9f\u884c\u65b9\u6cd5<\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/softantenna.com\/blog\/wp-content\/uploads\/2015\/01\/I1.-main.png\" alt=\"1 main\" title=\"1. main.png\" border=\"0\" width=\"546\" height=\"249\" \/><\/p>\n<p>lsh\u306f\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3067\u30b3\u30f3\u30d1\u30a4\u30eb\/\u5b9f\u884c\u3067\u304d\u307e\u3059\u3002Mac OS X\u3067\u78ba\u8a8d\u3057\u307e\u3057\u305f\u3002<\/p>\n<pre>\ngit clone https:\/\/github.com\/brenns10\/lsh\ncd lsh\/src\ngcc -o main main.c\n.\/main\n<\/pre>\n<p>lsh\u306f\u5916\u90e8\u30b3\u30de\u30f3\u30c9\u306e\u8d77\u52d5\u3068\u3001cd \/ help \/ exit\u304f\u3089\u3044\u3057\u304b\u5b9f\u884c\u3067\u304d\u306a\u3044\u30b7\u30f3\u30d7\u30eb\u306a\u30b7\u30a7\u30eb\u3067\u3059\u304c\u3001\u6700\u4f4e\u9650\u306e\u6a5f\u80fd\u306f\u5b9f\u88c5\u3055\u308c\u3066\u3044\u307e\u3059\u3002UNIX\u306e\u30b7\u30b9\u30c6\u30e0\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u306b\u8208\u5473\u304c\u3042\u308b\u65b9\u306f\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u306b\u30c1\u30e3\u30ec\u30f3\u30b8\u3057\u3066\u307f\u3066\u306f\u3044\u304b\u304c\u3067\u3057\u3087\u3046\u304b\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>UNIX\u3067\u6b20\u304b\u3059\u3053\u3068\u304c\u3067\u304d\u306a\u3044\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u4e00\u3064\u306b\u300c\u30b7\u30a7\u30eb\u300d\u304c\u6319\u3052\u3089\u308c\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002\u30b7\u30a7\u30eb\u306f\u30e6\u30fc\u30b6\u30fc\u306e\u30b3\u30de\u30f3\u30c9\u5165\u529b\u3092\u53d7\u3051\u53d6\u3063\u3066\u6307\u793a\u3092OS\u306b\u4f1d\u3048\u305f\u308a\u3001\u7d50\u679c\u3092\u753b\u9762\u306b\u8868\u793a\u3057\u305f\u308a\u3001\u3068\u3044\u3063\u305f\u5927\u5207\u3084\u5f79\u5272\u3092\u62c5\u3063\u3066\u3044\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u3059\u3002 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":26797,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"swell_btn_cv_data":"","footnotes":""},"categories":[75],"tags":[1383,3302],"class_list":["post-26800","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software","tag-shell","tag-unix"],"_links":{"self":[{"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/posts\/26800","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/comments?post=26800"}],"version-history":[{"count":0,"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/posts\/26800\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/media\/26797"}],"wp:attachment":[{"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/media?parent=26800"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/categories?post=26800"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/tags?post=26800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}