亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 8850 | 回復(fù): 10
打印 上一主題 下一主題

[Linux] 關(guān)于fork之后父子進(jìn)程的文件描述符關(guān)系有些疑問? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-01-14 02:22 |只看該作者 |倒序?yàn)g覽

在重定向父進(jìn)程的標(biāo)準(zhǔn)輸出時(shí),子進(jìn)程的標(biāo)準(zhǔn)輸出也被重定向。實(shí)際上,fork的一個(gè)特性是父進(jìn)程的所有打開文件描述符都被復(fù)制到子進(jìn)程中。父子進(jìn)程的每個(gè)相同的打開描述符共享一個(gè)文件表項(xiàng)。
有點(diǎn)不理解的是,如果在fork之后父進(jìn)程改變了文件描述符fd的指向,為什么子進(jìn)程對(duì)應(yīng)的文件描述符也會(huì)改變指向?

論壇徽章:
13
雙魚座
日期:2013-10-23 09:30:05數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-04-20 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-03-09 06:20:002015亞冠之塔什干火車頭
日期:2015-11-02 10:07:452015亞冠之德黑蘭石油
日期:2015-08-30 10:07:07數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-08-28 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龍
日期:2014-12-03 14:45:52酉雞
日期:2014-07-23 09:46:23亥豬
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
2 [報(bào)告]
發(fā)表于 2015-01-14 09:41 |只看該作者
你上面不是說共享了嘛

論壇徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亞洲杯之阿曼
日期:2015-04-14 10:41:50NBA常規(guī)賽紀(jì)念章
日期:2015-05-04 22:32:03NBA季后賽大富翁
日期:2015-05-04 22:34:11菠菜明燈
日期:2015-05-04 22:35:49新奧爾良黃蜂
日期:2015-05-04 22:49:2315-16賽季CBA聯(lián)賽之廣夏
日期:2015-12-11 15:02:342015年亞洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亞洲杯之阿聯(lián)酋
日期:2015-03-04 11:19:04休斯頓火箭
日期:2015-03-02 16:32:11紐約尼克斯
日期:2015-03-02 16:09:04
3 [報(bào)告]
發(fā)表于 2015-01-14 10:01 |只看該作者
上代碼吧!

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2015-01-14 18:41 |只看該作者
回復(fù) 2# bikong0411

恩恩,自己寫了代碼測(cè)試了一下,如果在fork之前改變描述符的指向,子進(jìn)程與父進(jìn)程的寫到同一文件。也就是父子進(jìn)程的每個(gè)相同的打開描述符共享一個(gè)文件表項(xiàng)。
但是如果在fork之后改變描述符的指向,則只會(huì)對(duì)父子進(jìn)程中的一個(gè)產(chǎn)生影響。


   

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2015-01-14 18:45 |只看該作者
回復(fù) 3# super皮波
寫了代碼測(cè)試了一下,這是fork之后把標(biāo)準(zhǔn)輸出重定向到一個(gè)hello文件
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/stat.h>
  5. #include <sys/types.h>
  6. #include <fcntl.h>

  7. int main(void)
  8. {
  9.     pid_t pid;
  10.     int fd1, i = 1;

  11.     pid = fork();
  12.     if(pid < 0)
  13.     {
  14.         perror("fork");
  15.         exit(1);
  16.     }
  17.     else if(pid == 0)
  18.     {
  19.         while(1)
  20.         {
  21.             printf("write %d by child\n",i++);
  22.             sleep(1);
  23.         }
  24.     }
  25.     else
  26.     {
  27.         sleep(10);
  28.         fd1 = open("hello",O_CREAT | O_RDONLY | O_WRONLY | O_APPEND,0755);
  29.         if(fd1 < 0)
  30.         {
  31.             perror("open");
  32.             exit(1);
  33.         }
  34.         dup2(fd1,STDOUT_FILENO);
  35.         while(1)
  36.         {
  37.             printf("write %d by parent\n",i++);
  38.         }
  39.     }

  40.     return 0;
  41. }
復(fù)制代碼
這個(gè)是在fork之前把標(biāo)準(zhǔn)輸出重定向到hello文件
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/stat.h>
  5. #include <sys/types.h>
  6. #include <fcntl.h>

  7. int main(void)
  8. {
  9.     pid_t pid;
  10.     int fd1, i = 1;

  11.     fd1 = open("hello",O_CREAT | O_RDONLY | O_WRONLY | O_APPEND,0755);
  12.     if(fd1 < 0)
  13.     {
  14.         perror("open");
  15.         exit(1);
  16.     }
  17.     dup2(fd1,STDOUT_FILENO);
  18.     pid = fork();
  19.     if(pid < 0)
  20.     {
  21.         perror("fork");
  22.         exit(1);
  23.     }
  24.     else if(pid == 0)
  25.     {
  26.         while(1)
  27.         {
  28.             printf("write %d by child\n",i++);
  29.             usleep(10000);
  30.         }
  31.     }
  32.     else
  33.     {
  34.         sleep(5);
  35.         while(1)
  36.         {
  37.             printf("write %d by parent\n",i++);
  38.             usleep(10000);
  39.         }
  40.     }

  41.     return 0;
  42. }
復(fù)制代碼
剛開始的時(shí)候一直不太理解

論壇徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亞洲杯之阿曼
日期:2015-04-14 10:41:50NBA常規(guī)賽紀(jì)念章
日期:2015-05-04 22:32:03NBA季后賽大富翁
日期:2015-05-04 22:34:11菠菜明燈
日期:2015-05-04 22:35:49新奧爾良黃蜂
日期:2015-05-04 22:49:2315-16賽季CBA聯(lián)賽之廣夏
日期:2015-12-11 15:02:342015年亞洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亞洲杯之阿聯(lián)酋
日期:2015-03-04 11:19:04休斯頓火箭
日期:2015-03-02 16:32:11紐約尼克斯
日期:2015-03-02 16:09:04
6 [報(bào)告]
發(fā)表于 2015-01-14 19:02 |只看該作者
回復(fù) 5# sagarfan
直接給你貼一張圖


   

論壇徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亞洲杯之阿曼
日期:2015-04-14 10:41:50NBA常規(guī)賽紀(jì)念章
日期:2015-05-04 22:32:03NBA季后賽大富翁
日期:2015-05-04 22:34:11菠菜明燈
日期:2015-05-04 22:35:49新奧爾良黃蜂
日期:2015-05-04 22:49:2315-16賽季CBA聯(lián)賽之廣夏
日期:2015-12-11 15:02:342015年亞洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亞洲杯之阿聯(lián)酋
日期:2015-03-04 11:19:04休斯頓火箭
日期:2015-03-02 16:32:11紐約尼克斯
日期:2015-03-02 16:09:04
7 [報(bào)告]
發(fā)表于 2015-01-14 19:08 |只看該作者
進(jìn)程A的fd0和fd20這種就是dup類系統(tǒng)調(diào)用的結(jié)果
進(jìn)程A的fd2和進(jìn)程B的fd2就是fork的結(jié)果(fork之后指向相同的文件)
進(jìn)程A的fd0和進(jìn)程B的fd3最終指向同一個(gè)inode,這是這兩個(gè)進(jìn)程都調(diào)用過open的結(jié)果,此時(shí)兩個(gè)文件不共享文件內(nèi)的偏移
文件偏移是存放在第二個(gè)表中的,所以不管是dup還是fork,都是共享同一組偏移

論壇徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亞洲杯之阿曼
日期:2015-04-14 10:41:50NBA常規(guī)賽紀(jì)念章
日期:2015-05-04 22:32:03NBA季后賽大富翁
日期:2015-05-04 22:34:11菠菜明燈
日期:2015-05-04 22:35:49新奧爾良黃蜂
日期:2015-05-04 22:49:2315-16賽季CBA聯(lián)賽之廣夏
日期:2015-12-11 15:02:342015年亞洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亞洲杯之阿聯(lián)酋
日期:2015-03-04 11:19:04休斯頓火箭
日期:2015-03-02 16:32:11紐約尼克斯
日期:2015-03-02 16:09:04
8 [報(bào)告]
發(fā)表于 2015-01-14 19:09 |只看該作者
還需要注意的是左邊的是進(jìn)程級(jí)別的,中間的是系統(tǒng)級(jí)別的,記錄整個(gè)系統(tǒng)中打開的文件,inode可以理解成存在硬盤上的文件

論壇徽章:
13
雙魚座
日期:2013-10-23 09:30:05數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-04-20 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-03-09 06:20:002015亞冠之塔什干火車頭
日期:2015-11-02 10:07:452015亞冠之德黑蘭石油
日期:2015-08-30 10:07:07數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-08-28 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龍
日期:2014-12-03 14:45:52酉雞
日期:2014-07-23 09:46:23亥豬
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
9 [報(bào)告]
發(fā)表于 2015-01-15 09:46 |只看該作者
回復(fù) 4# sagarfan


    子進(jìn)程復(fù)制的父進(jìn)程的文件描述符

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2015-01-15 13:49 |只看該作者
回復(fù) 7# super皮波
恩恩,非常感謝,但是那個(gè)dup產(chǎn)生的應(yīng)該是進(jìn)程A的fd1和fd20吧


   
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP