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

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

Chinaunix

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

[學(xué)習(xí)] APUE記錄鎖問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-12-28 21:48 |只看該作者 |倒序?yàn)g覽
    我的程序是父,子2個(gè)進(jìn)程嘗試對(duì)一個(gè)打開的文件的同一區(qū)域加寫鎖。先讓子進(jìn)程獲得鎖,然后再讓父進(jìn)程去鎖。按正常的運(yùn)行,應(yīng)該是父進(jìn)程測(cè)試鎖時(shí)會(huì)發(fā)現(xiàn)已有一個(gè)排斥它的鎖存在,但是實(shí)際程序運(yùn)行卻發(fā)現(xiàn)父進(jìn)程會(huì)發(fā)現(xiàn)可以加鎖。代碼如下:
  1. void pflock(struct flock *fl)
  2. {
  3.     printf("fl.l_type:%d,fl.l_whence::%d,fl.l_start:%d,fl.l_len:%d,fl.l_pid:%lu\n",fl->l_type,fl->l_whence,fl->l_start,fl->l_len,(long)fl->l_pid);
  4. }
  5. int main(void)
  6. {
  7.     int fd, ret;
  8.     pid_t pid;
  9.     struct flock fl;
  10.    
  11.     fd = open("./d", O_RDWR);
  12.     if ( fd < 0 )
  13.     {
  14.         perror("open");
  15.         return -1;
  16.     }

  17.     pid = fork();
  18.     if ( pid < 0 )
  19.     {
  20.         perror("fork");
  21.         close(fd);
  22.         return -1;
  23.     }
  24.     else if ( pid == 0 )
  25.     {
  26.         printf("child pid:%lu\n",(long)getpid());
  27.         fl.l_type = F_WRLCK;
  28.         fl.l_whence = SEEK_SET;
  29.         fl.l_start = 1;
  30.         fl.l_len = 2;
  31.         fl.l_pid = getpid();
  32.         
  33.         ret = fcntl(fd, F_GETLK, &fl);
  34.         if ( fl.l_type != F_UNLCK )
  35.         {
  36.             printf("already have a file lock\n");
  37.             pflock(&fl);
  38.             close(fd);
  39.             exit(0);
  40.         }

  41.         printf("child set flock\n");
  42.         ret = fcntl(fd, F_SETLK, &fl);
  43.         if ( ret < 0 )
  44.         {
  45.             perror("fcntl");
  46.             close(fd);
  47.             exit(0);
  48.         }
  49.         while(1);
  50.     }
  51.     else
  52.     {
  53.         printf("parent pid:%lu\n",(long)getpid());
  54.         sleep(1);   //let child process get a flock before parents
  55.         
  56.         fl.l_type = F_WRLCK;
  57.         fl.l_whence = SEEK_SET;
  58.         fl.l_start = 1;
  59.         fl.l_len = 2;
  60.         fl.l_pid = getpid();
  61.         
  62.         ret = fcntl(fd, F_GETLK, &fl);
  63.         if ( fl.l_type != F_UNLCK )
  64.         {
  65.             printf("already have a file lock\n");
  66.             pflock(&fl);
  67.             close(fd);
  68.             exit(0);
  69.         }
  70.         
  71.         printf("parent set flock\n");
  72.         ret = fcntl(fd, F_SETLK, &fl);
  73.         if ( ret < 0 )
  74.         {
  75.             perror("fcntl");
  76.             close(fd);
  77.             exit(0);
  78.         }
  79.         while(1);
  80.     }

  81.     close(fd);
  82.     exit(0);
  83. }
復(fù)制代碼
按我的預(yù)期是,父進(jìn)程在 if ( fl.l_type != F_UNLCK ) 這個(gè)判斷中會(huì)退出。而實(shí)際運(yùn)行卻發(fā)現(xiàn)程序繼續(xù)運(yùn)行了下去,并加了寫鎖。

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2015-12-29 16:11 |只看該作者
問題已解決,是自己粗心導(dǎo)致,子進(jìn)程測(cè)試是否有鎖時(shí),type類型被修改為F_UNLCK,設(shè)置鎖時(shí),忘記將類型重新改回為F_RDLC。
您需要登錄后才可以回帖 登錄 | 注冊(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ū)
中國(guó)互聯(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