初めて質問させていただきます。
クラリスと申します。
環境は、Linuxでgcc(2.95)を使っています。
質問の内容はタイトルのとおり、
forkを使ったexecの使用方法です。
[a.out]プログラム
void main(){
while(1){
// 何かの処理…X
}
}
void main(){
if ( fork() == 0 ){
execl(a.out, (char*)0);
}
while(1){
// 別の処理
}
}
上記の方法で子プロセスを作って別々に処理をしたいのですが、「X」の内容によって正常に処
理が行われない時があります。それはなぜなのでしょうか?
ご教授ください。よろしくお願いします。
#ここ(VC++のコーナー)でUnixのfork()について質問されてもなあ。
普通こう使うらしいのだが...
int pid;
pid = fork();
if ( pid == -1 ){
エラー
} else {
if ( pid == 0 ){
子プロセス
} else {
親プロセス
}
}
#また間違っておくってしまった
こんな感じになるんじゃないの?
void main(){
int pid = fork();
if ( pid== -1 ){
// Error
} else {
if (pid==0){//子プロセス
while(1){
// 何かの処理…X
}
} else {// 親プロセス
while(1){
// 別の処理
}
}
}
}
execlする理由は?
あ、すいません…(@_@)
VC++,C/C++の質問掲示板と書いてあったので、質問可能と思って質問させてもらったのです
が…ここは、UNIXのCは駄目だったんですね。申し訳ありません。
結論としては、私が行おうとしている事は正しいと言う事ですね…
正常に処理されないのは、子プロセスで使用している処理に問題がありそうだという事になりそ
うです。
ボコノン教徒さん、ご回答ありがとうございます。
ああ…返事が遅れてしまいました。
>execlする理由は?
execlするファイルはサーバー機能を持った実行ファイルだからなのです。
度々ご回答ありがとうございます。
> UNIXのCは駄目だったんですね。申し訳ありません。
一般的なC/C++の話題はOKなんですが、UNIX特有の話題を投げられても
答えられる人が「年寄り」に限られちゃうので。
> execl(a.out, (char*)0);
これ、正常に動いてます?
a.outの起動に失敗すると、その下の同じWhileループが
同時に実行されちゃいますけど。
a.outは正常に起動しています。psコマンドで確認しました。
execlはChain(元プロセスは終了してしまう)ですよね。
となると、
while(1){
// 何かの処理…X
}
と
while(1){
// 別の処理
}
が何やってるの?、と言う話になるのだけど、
具体的なコードが示されてないので、
同じリソースにアクセスする時に排他処理はやってる?
というアドバイスぐらいしかできません。
ご回答ありがとうございます。
親プロセス側がキー入力待ち、子プロセスが状態表示等をやっています。
そのようなコンソール状態だと表示も制御もおかしくなるので、
とりあえず、別々に起動することにします。
色々とアドバイスありがとうございました。m(__)m