質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

4955閲覧

c言語でexecv関数を使ってディレクトリを変更するプログラムの作成

ijuya_yika

総合スコア50

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/11/12 02:49

編集2017/11/12 02:52

###前提・実現したいこと
c言語でexecv関数を使ってディレクトリを変更するプログラムの作成したい

###発生している問題・エラーメッセージ
予めtestというディレクトリを実行ファイルと同じディレクトリに用意しcd testtestにディレクトリを変更したいが

No such file or directory: No such file or directory

とエラーが出る

###該当のソースコード

C

1#include <stdio.h> 2#include <unistd.h> 3#include <string.h> 4#include <errno.h> 5 6int main(int argc, char *argv[]){ 7 char *const str[] = {"/bin/cd","test", NULL}; 8 execv("/bin/cd", str); 9 10 if(errno != 0) 11 perror(strerror(errno)); 12 13 return -1; 14} 15

###試したこと
lsmkdirコマンドは↑のコードを変更して出来たのですが
cdだけ出来ないです
/testとかも試したのですが駄目でした
どなたか分かる方教えていただけないでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

cdは「現在のプロセスの作業ディレクトリーを変更する」ものであって「サブプロセスで実行しても意味がない」ものの一つです。そのため、カレントディレクトリーを変更するようなプログラムを作ってそれをシェルから起動しても意図通りの動作にはなりません。そのため/bin/cdというコマンドは(あっても意味がないため)存在せず「No such file or directory」になるわけです。

シェルのcdはビルトインコマンドになっており、/binや/usr/binの下にある一般のコマンドのように「プロセスを生成してその中で動かす」のではなく実行中のシェルが直接chdirシステムコールを呼び出して現在のプロセスのカレントディレクトリーを変更する実装になっています。

同様にexportなども、サブプロセスを起動してその中で環境変数の変更を行っても、プロセス起動物のプロセスの環境変数が変化するわけではないので、ビルトインコマンドとして実装されています。


追記:上記の話では以下の知識がないと理解が難しいかもと気づきました。
Cでexecutableファイル(a.outみたいなもの)を作ってシェルから呼び出す場合、次のように動きます。

(1) シェルは子供プロセスをfork()で生成する
(2) 生成された子供プロセスからexecv()で指定されたexecutableファイルを実行する

つまりexecutableファイルは常に起動元のシェルの子供プロセスで実行されており、子供プロセスで行った「プロセス固有の情報」の変更は親プロセスには影響しません。カレントディレクトリーはプロセス固有の情報ですのでexecutableファイルで変更しても親プロセスにはなんら影響を及ぼすことができないということです。

なんか・・・わかりにくい説明でスミマセン

投稿2017/11/12 03:00

編集2017/11/12 03:15
KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ijuya_yika

2017/11/12 03:54

「cdは現在のプロセスの作業ディレクトリーを変更するもの」なのでfork関数でプロセスを呼び出している以上呼び出されたプロセスで何やっても意味ないのですね。迅速かつ丁寧なご回答ありがとうございました。とても分かりやすかったです。
KSwordOfHaste

2017/11/12 04:17

余談ですが、Unixを開発した人たちも最初この点を見落として、/bin/cdコマンドを作ろうとしたという記事を読んだことがあります。実際にやってみて「意味なかった!」と気づきあわててシェルのビルトインコマンドとして実装しなおしたそうです。開発者でもこうした勘違いをしていたんですね。ちょっと愉快なトリビアだったので今でも覚えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問