藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月6日 10:18


在fork函數問題中,這句指令怎麼執行???

[code]
#include <sys/types.h>;
#include <stdlib.h>;
#include <stdio.h>;

int glob = 6;
char buf[] = "a write to stdout\n";

int main(void)
{
        int var;
        pid_t pid;

        var = 88;
        if(write(1, buf, sizeof(buf)-1)!=sizeof(buf)-1)
        {
                printf("write error!\n");
                exit(1);
        }
        printf("before fork!\n");
        if((pid = fork())<0)
        {
                printf("fork error!\n");
                exit(1);
        }
        else if(pid==0)
        {
                glob++;
                var++;
        }
        else
        {
                sleep(2);
        }
        printf("pid=%d, glob=%d, var=%d\n",getpid(),glob,var);  /*****問題所在*****/
        exit(0);
}

[/code]

執行結果為

a write to stdout
before fork!
pid=2402, glob=7, var=89
pid=2401, glob=6, var=88

我想問的是我標記的printf("pid=%d, glob=%d, var=%d\n",getpid(),glob,var);  
這句指令為什麼要執行兩次, 它是不是應該是在父進程中的,為什麼會在子進程中執行.

請問為什麼?謝謝

注:該源代碼來自<<UNIX環境高級編程>;>;P143 程序8-1
[b][/b]

在fork函數問題中,這句指令怎麼執行???

子進程沒有exit,當然會執行下去。

在fork函數問題中,這句指令怎麼執行???

那麼子進程沒有exit回接著執行什麼?是後續的程序嗎?

在fork函數問題中,這句指令怎麼執行???

我也有個問題。如何kill 自己

/* daemon.c */
/* author:netkiller
* title :fork template
* */
#include<unistd.h>;
#include<sys/types.h>;
#include <sys/stat.h>;
#include <stdio.h>;
#include <string.h>;

#define MAXFILE 65535

void log(){
   FILE *fp;
   time_t t;
   if((fp=fopen("fork.log","a")) >;=0){
       t=time(0);
       fprintf(fp,"I'm here at %s\n",asctime(localtime(&t)) );
       fclose(fp);
   }
}

void my_daemon(){

        pid_t pid;
        int i;
        pid=fork();
        if(pid<0){
                printf("error in fork\n");
                exit(1);
        }else if(pid>;0)
                exit(0);
        setsid();
        chdir("/tmp");
        umask(0);
        for(i=0;i<MAXFILE;i++)
        close(i);
}
void parameter(int argc,char **argv){
        char param[255];
        switch(argc){
            case 1:
                sprintf(param,"Usage: %s {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}\n",argv[0]);
                break;
            case 2:
                if(strcmp(argv[1],"start")==0){
                        my_daemon();
                        sprintf(param,"Starting\n",argv[0]);
                }else if(strcmp(argv[1],"stop")==0){
                        printf("%d",getpid());
                        //kill();
                }
                break;       
        }
        printf(param);
}
       
main(int argc,char **argv)
{
    parameter(argc,argv);
   /*
    for(;;){
        sleep(10);
        log();
    }
    */

}

當xxx stop 自殺。如何寫。。。

在fork函數問題中,這句指令怎麼執行???

man 2 kill

例如
kill(getpid(), SIGTERM);

在fork函數問題中,這句指令怎麼執行???

getpid() 取得是自己的IP。
不是以運行的守護進程的那個ID

在fork函數問題中,這句指令怎麼執行???

-->     

你不是要kill自己嗎?

gadfly版主提供的示例是沒問題的。

在fork函數問題中,這句指令怎麼執行???

你看看我寫的fork()模板。

Usage: %s {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}

xxxx start 啟動
啟動後在後台運行。。
ps ax 可以看到。。
xxxx stop 停止
停止是的。ps ax 看到的xxxx start 那個。

在fork函數問題中,這句指令怎麼執行???

在fork函數問題中,這句指令怎麼執行???

faint。netkiller,老是不寫清楚。

像這種啟停,在unix上有很多的方式。啟停腳本是最常見的。

如果是程序中實現,一般也是保存daemon pid,然後像pid發信號的方式

在fork函數問題中,這句指令怎麼執行???

啟動腳本,我會.
我想用程序實現.

我沒裝無比,所以打字,就像發手機段心一樣,煩人.
所以,老是不寫清楚

在fork函數問題中,這句指令怎麼執行???

kao,炫耀自己吧?我還不會五筆呢!,只會拼音。
老大,你下面的圖片傳送太慢了。還是換成簽名檔吧。我寫字的時候,屏幕佈局不停的變化,感覺像中了病毒一樣。

進程方式常見的就是通過保存pid的方式。



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com