ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    使用可能タグ一覧

No.2699

fork()関数の返値は
投稿者---megumi(2004/09/24 14:43:57)


Linux上で下記のプログラムをコンパイル・実行してみました。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc,char *argv[]){
int dep_time;
dep_time=atoi(argv[1])*60-300;
pid_t p;
printf("start\n");
if(p=fork()==0){ //親プロセスの返値は子プロセスID、子プロセスの返値は成功時0、、失敗時-1
printf("child=%d\n",p);
sleep(dep_time);
fprintf(stderr,"You have to leave in 5 minutes\n");
}
else{
printf("parents=%d\n",p);
}
printf("end\n");
return EXIT_SUCCESS;
}


fork関数の返値は「親プロセスの返値は子プロセスID、子プロセスの返値は成功時0、、失敗時-1」
なので
「printf("child=%d\n",p);」では0
「printf("parents=%d\n",p);」では5687
(5687は子プロセスのプロセスID)

という風になると予想していたのですが実際には

実行結果は


$ ./nsh 6
start
child=1
parents=0
end
$ You have to leave in 5 minutes
end

となってしまいました。
どうしてこのような結果になるのでしょうか?




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:fork()関数の返値は 2700 NykR 2004/09/24 14:57:35


No.2700

Re:fork()関数の返値は
投稿者---NykR(2004/09/24 14:57:35)


> if(p=fork()==0){

p=fork()==0


p=(fork()==0)
と同じ意味です。

ですから pに代入される値は fork()==0 という式の値になり、
この式が真ならば 1、偽ならば(fork()!=0ならば) 0になります。

参考:14−5.演算子の優先順位と結合規則


この投稿にコメントする

削除パスワード

No.2702

(お礼)Re:fork()関数の返値は
投稿者---megumi(2004/09/25 00:29:43)


「 if((p=fork())==0){ 」
という風に括弧をつけて

$ ./nsh 6
start
child=0
parents=32480
end
$ You have to leave in 5 minutes
end

と上手くいきました。

有難うございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    使用可能タグ一覧




掲示板提供:Real Integrity