日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux fcntl

發(fā)布時間:2025/3/15 linux 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux fcntl 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

功能描述:根據(jù)文件描述詞來操作文件的特性。

文件控制函數(shù) ???????? fcntl -- file control
頭文件:

#include <unistd.h>

#include <fcntl.h>

函數(shù)原型:??????????

int fcntl(int fd, int cmd);

int fcntl(int fd, int cmd, long arg); ????????

int fcntl(int fd, int cmd, struct flock *lock);

描述:

?????????? fcntl()針對(文件)描述符提供控制.參數(shù)fd是被參數(shù)cmd操作(如下面的描述)的描述符. ???????????

    針對cmd的值,fcntl能夠接受第三個參數(shù)(arg)

fcntl函數(shù)有5種功能:

     1.復(fù)制一個現(xiàn)有的描述符(cmd=F_DUPFD.

  ??? ? ?2.獲得/設(shè)置文件描述符標(biāo)記(cmd=F_GETFDF_SETFD).

???????? ? ?3.獲得/設(shè)置文件狀態(tài)標(biāo)記(cmd=F_GETFLF_SETFL).

????????? ? 4.獲得/設(shè)置異步I/O所有權(quán)(cmd=F_GETOWNF_SETOWN).

????????????5.獲得/設(shè)置記錄鎖(cmd=F_GETLK,F_SETLKF_SETLKW).

?

?cmd?選項:

??????????? F_DUPFD??????返回一個如下描述的(文件)描述符: ???????????????????????????

????????           (1)最小的大于或等于arg的一個可用的描述符 ?????????????????????????

???            (2)與原始操作符一樣的某對象的引用 ??????????????

????????????        ? (3)如果對象是文件(file)的話,返回一個新的描述符,這個描述符與arg共享相同的偏移量(offset)????????????????????

            ???(4)相同的訪問模式(,寫或讀/)??????????????????????????

             (5)相同的文件狀態(tài)標(biāo)志(:兩個文件描述符共享相同的狀態(tài)標(biāo)志) ???????????????????????????

             (6)與新的文件描述符結(jié)合在一起的close-on-exec標(biāo)志被設(shè)置成交叉式訪問execve(2)的系統(tǒng)調(diào)用 ???? ??? ???????????

?????????????F_GETFD?????取得與文件描述符fd聯(lián)合close-on-exec標(biāo)志,類似FD_CLOEXEC.如果返回值和FD_CLOEXEC進(jìn)行與運算結(jié)果是0的話,文件保持交叉式訪問exec(),      ????????????????????? 否則如果通過exec運行的話,文件將被關(guān)閉(arg被忽略) ???? ??? ????????

?????????? ? F_SETFD?????設(shè)置close-on-exec旗標(biāo)。該旗標(biāo)以參數(shù)argFD_CLOEXEC位決定。???? ?? ???????????

???????????? F_GETFL?????取得fd的文件狀態(tài)標(biāo)志,如同下面的描述一樣(arg被忽略) ???? ?? ???????????

???????????? F_SETFL?????設(shè)置給arg描述符狀態(tài)標(biāo)志,可以更改的幾個標(biāo)志是:O_APPEND O_NONBLOCKO_SYNCO_ASYNC
?????????????F_GETOWN
取得當(dāng)前正在接收SIGIO或者SIGURG信號的進(jìn)程id或進(jìn)程組id,進(jìn)程組id返回成負(fù)值(arg被忽略) ???? ?? ???????????

???????????? F_SETOWN?設(shè)置將接收SIGIOSIGURG信號的進(jìn)程id或進(jìn)程組id,進(jìn)程組id通過提供負(fù)值的arg來說明,否則,arg將被認(rèn)為是進(jìn)程id
?? ???????????

命令字(cmd)F_GETFLF_SETFL的標(biāo)志如下面的描述:????????????

???????????? O_NONBLOCK??????? 非阻塞I/O;如果read(2)調(diào)用沒有可讀取的數(shù)據(jù),或者如果write(2)操作將阻塞,readwrite調(diào)用返回-1EAGAIN錯誤 ?????????????     ??????   O_APPEND??????????? ?強制每次寫(write)操作都添加在文件大的末尾,相當(dāng)于open(2)O_APPEND標(biāo)志?????????

?????????????O_DIRECT?????????????最小化或去掉readingwriting的緩存影響.系統(tǒng)將企圖避免緩存你的讀或?qū)懙臄?shù)據(jù).

???????????????????????????? 如果不能夠避免緩存,那么它將最小化已經(jīng)被緩存了的數(shù) 據(jù)造成的影響.如果這個標(biāo)志用的不夠好,將大大的降低性能 ?????????????????????

???????????? O_ASYNC??????????????當(dāng)I/O可用的時候,允許SIGIO信號發(fā)送到進(jìn)程組,例如:當(dāng)有數(shù)據(jù)可以讀的時候

?注意:????? 在修改文件描述符標(biāo)志或文件狀態(tài)標(biāo)志時必須謹(jǐn)慎,先要取得現(xiàn)在的標(biāo)志值,然后按照希望修改它,最后設(shè)置新標(biāo)志值。不能只是執(zhí)行F_SETFDF_SETFL命令,這樣會關(guān)閉以前設(shè)置的標(biāo)志位。

fcntl的返回值:? 與命令有關(guān)。如果出錯,所有命令都返回-1,如果成功則返回某個其他值。下列三個命令有特定返回值:F_DUPFD,F_GETFD,F_GETFL以及F_GETOWN。第一個返回新的文件描述符,第二個返回相應(yīng)標(biāo)志,最后一個返回一個正的進(jìn)程ID或負(fù)的進(jìn)程組ID

?

一:第一種類似于dup操作,在這里不做舉例。(fcnlt(oldfd, F_DUPFD, 0) <==>dup2(oldfd, newfd))

二:設(shè)置close-on-exec旗標(biāo)

在此函數(shù)中創(chuàng)建子進(jìn)程,調(diào)用execl

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int main() 6 { 7 pid_t pid; 8 //以追加的形式打開文件 9 int fd = fd = open("test.txt", O_TRUNC | O_RDWR | O_APPEND | O_CREAT, 0777); 10 if(fd < 0) 11 { 12 perror("open"); 13 return -1; 14 } 15 printf("fd = %d\n", fd); 16 17 fcntl(fd, F_SETFD, 0);//關(guān)閉fd的close-on-exec標(biāo)志 18 19 write(fd, "hello c program\n", strlen("hello c program!\n")); 20 21 pid = fork(); 22 if(pid < 0) 23 { 24 perror("fork"); 25 return -1; 26 } 27 if(pid == 0) 28 { 29 printf("fd = %d\n", fd); 30 31 int ret = execl("./main", "./main", (char *)&fd, NULL); 32 if(ret < 0) 33 { 34 perror("execl"); 35 exit(-1); 36 } 37 exit(0); 38 } 39 40 wait(NULL); 41 42 write(fd, "hello c++ program!\n", strlen("hello c++ program!\n")); 43 44 close(fd); 45 46 return 0; 47 }

main測試函數(shù)

1 int main(int argc, char *argv[]) 2 { 3 int fd = (int)(*argv[1]);//描述符 4 5 printf("fd = %d\n", fd); 6 7 int ret = write(fd, "hello linux\n", strlen("hello linux\n")); 8 if(ret < 0) 9 { 10 perror("write"); 11 return -1; 12 } 13 14 close(fd); 15 16 return 0; 17 }

執(zhí)行后文件結(jié)果:

[root@centOS5 class_2]# cat test.txt
hello c program
hello linux
hello c++ program!

?

三:用命令F_GETFL和F_SETFL設(shè)置文件標(biāo)志,比如阻塞與非阻塞

1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <unistd.h> 4 #include <sys/stat.h> 5 #include <fcntl.h> 6 #include <string.h> 7 8 /**********************使能非阻塞I/O******************** 9 *int flags; 10 *if(flags = fcntl(fd, F_GETFL, 0) < 0) 11 *{ 12 * perror("fcntl"); 13 * return -1; 14 *} 15 *flags |= O_NONBLOCK; 16 *if(fcntl(fd, F_SETFL, flags) < 0) 17 *{ 18 * perror("fcntl"); 19 * return -1; 20 *} 21 *******************************************************/ 22 23 /**********************關(guān)閉非阻塞I/O****************** 24 flags &= ~O_NONBLOCK; 25 if(fcntl(fd, F_SETFL, flags) < 0) 26 { 27 perror("fcntl"); 28 return -1; 29 } 30 *******************************************************/ 31 32 int main() 33 { 34 char buf[10] = {0}; 35 int ret; 36 int flags; 37 38 //使用非阻塞io 39 if(flags = fcntl(STDIN_FILENO, F_GETFL, 0) < 0) 40 { 41 perror("fcntl"); 42 return -1; 43 } 44 flags |= O_NONBLOCK; 45 if(fcntl(STDIN_FILENO, F_SETFL, flags) < 0) 46 { 47 perror("fcntl"); 48 return -1; 49 } 50 51 while(1) 52 { 53 sleep(2); 54 ret = read(STDIN_FILENO, buf, 9); 55 if(ret == 0) 56 { 57 perror("read--no"); 58 } 59 else 60 { 61 printf("read = %d\n", ret); 62 } 63 64 write(STDOUT_FILENO, buf, 10); 65 memset(buf, 0, 10); 66 } 67 68 return 0; 69 }

四:設(shè)置異步IO還沒想好以后實現(xiàn)(呵呵呵。。。。。)

五:設(shè)置獲取記錄鎖

結(jié)構(gòu)體flock的指針

struct flcok

{

   short int l_type; /* 鎖定的狀態(tài)*/

    //這三個參數(shù)用于分段對文件加鎖,若對整個文件加鎖,則:l_whence=SEEK_SET,l_start=0,l_len=0;

   short int l_whence;/*決定l_start位置*/

   off_t l_start; /*鎖定區(qū)域的開頭位置*/

   off_t l_len; /*鎖定區(qū)域的大小*/

   pid_t l_pid; /*鎖定動作的進(jìn)程*/

};

l_type 有三種狀態(tài):

   F_RDLCK 建立一個供讀取用的鎖定

   F_WRLCK 建立一個供寫入用的鎖定

?????? F_UNLCK 刪除之前建立的鎖定

l_whence 也有三種方式:

  SEEK_SET 以文件開頭為鎖定的起始位置。

?????SEEK_CUR 以目前文件讀寫位置為鎖定的起始位置

??? ?SEEK_END 以文件結(jié)尾為鎖定的起始位置。

?

?

1 #include "filelock.h" 2 3 /* 設(shè)置一把讀鎖 */ 4 int readLock(int fd, short start, short whence, short len) 5 { 6 struct flock lock; 7 lock.l_type = F_RDLCK; 8 lock.l_start = start; 9 lock.l_whence = whence;//SEEK_CUR,SEEK_SET,SEEK_END 10 lock.l_len = len; 11 lock.l_pid = getpid(); 12 // 阻塞方式加鎖 13 if(fcntl(fd, F_SETLKW, &lock) == 0) 14 return 1; 15 16 return 0; 17 } 18 19 /* 設(shè)置一把讀鎖 , 不等待 */ 20 int readLocknw(int fd, short start, short whence, short len) 21 { 22 struct flock lock; 23 lock.l_type = F_RDLCK; 24 lock.l_start = start; 25 lock.l_whence = whence;//SEEK_CUR,SEEK_SET,SEEK_END 26 lock.l_len = len; 27 lock.l_pid = getpid(); 28 // 非阻塞方式加鎖 29 if(fcntl(fd, F_SETLK, &lock) == 0) 30 return 1; 31 32 return 0; 33 } 34 /* 設(shè)置一把寫鎖 */ 35 int writeLock(int fd, short start, short whence, short len) 36 { 37 struct flock lock; 38 lock.l_type = F_WRLCK; 39 lock.l_start = start; 40 lock.l_whence = whence; 41 lock.l_len = len; 42 lock.l_pid = getpid(); 43 44 //阻塞方式加鎖 45 if(fcntl(fd, F_SETLKW, &lock) == 0) 46 return 1; 47 48 return 0; 49 } 50 51 /* 設(shè)置一把寫鎖 */ 52 int writeLocknw(int fd, short start, short whence, short len) 53 { 54 struct flock lock; 55 lock.l_type = F_WRLCK; 56 lock.l_start = start; 57 lock.l_whence = whence; 58 lock.l_len = len; 59 lock.l_pid = getpid(); 60 61 //非阻塞方式加鎖 62 if(fcntl(fd, F_SETLK, &lock) == 0) 63 return 1; 64 65 return 0; 66 } 67 68 /* 解鎖 */ 69 int unlock(int fd, short start, short whence, short len) 70 { 71 struct flock lock; 72 lock.l_type = F_UNLCK; 73 lock.l_start = start; 74 lock.l_whence = whence; 75 lock.l_len = len; 76 lock.l_pid = getpid(); 77 78 if(fcntl(fd, F_SETLKW, &lock) == 0) 79 return 1; 80 81 return 0; 82 } 新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!

總結(jié)

以上是生活随笔為你收集整理的linux fcntl的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品伦子伦 | 91精品国产综合久久精品图片 | 久久成人资源 | 在线中文字幕av | 午夜精品久久 | 国产黑人 | 欧美日韩国产精品成人 | 青草伊人久久 | 免费精品在线观看 | 免费成人电影在线观看 | 视频一区在线免费观看 | 香蕉视频二区 | 久久久久久久久亚洲 | 午夜一区二区视频 | 国产又粗又猛又爽又黄av | 久久看片网 | www.日日操 | 国产精品久久久国产盗摄 | 手机亚洲第一页 | 亚洲av无码一区二区乱子伦as | jizjiz中国少妇高潮水多 | 播放毛片 | 中文字幕 自拍 | 黄色长视频 | 日韩视频在线观看一区二区三区 | 怡红院一区二区 | 手机看片国产精品 | 国产精品一区二区三区四区视频 | 二区视频在线 | 亚洲精品中文字幕成人片 | 日韩黄色免费网站 | 国产福利视频一区二区 | 日本视频网站在线观看 | 欧美一二区 | 女性裸体下面张开 | 高清乱码免费看污 | 丰满少妇一区二区 | 久草国产在线视频 | 久久黄色精品视频 | 动漫美女放屁 | 爱情岛论坛永久入址在线 | 韩国三色电费2024免费吗怎么看 | 理想之城连续剧40集免费播放 | 国产在线一区视频 | 欧美日韩国产精品一区 | 精品久久二区 | 日韩欧美亚洲 | 成人网站在线进入爽爽爽 | 五月天综合社区 | 国产视频精选 | 99精品久久精品一区二区 | 老外一级黄色片 | 日韩黄片一区二区三区 | 久久精品国产亚洲AV成人雅虎 | 中国亚洲老头同性gay男男… | 国产精品高潮呻吟久久久 | 国产a一区二区三区 | 国产成人超碰人人澡人人澡 | 亚洲精品一区二区三区新线路 | 久久99婷婷 | 久久青青视频 | 九九热在线精品视频 | 欧美精品亚洲 | www,五月天,com| 日韩精品一区在线视频 | av免费成人| 久久精品视频无码 | 女女综合网 | 成人一级在线 | 国产又猛又黄 | 成人国产一区二区三区精品麻豆 | 国产情侣激情自拍 | 亚洲一级在线播放 | 开心激情站 | 快射视频在线观看 | 国产黄视频网站 | 久久看视频 | 国产精品白嫩白嫩大学美女 | 北条麻妃久久精品 | 成人私密视频 | 在线亚洲观看 | 小镇姑娘1979版 | 91麻豆映画传媒 | 成人免费视频毛片 | 日韩福利视频在线观看 | 精品人妻一区二区三区四区 | 国产av一区不卡 | 欧美贵妇videos办公室 | 精品无码久久久久久国产 | 欧美日在线观看 | 国产精品s色 | 免费人成网站 | 久久新视频 | 日韩精品视 | 青青国产在线观看 | 国产午夜伦鲁鲁 | 久久国产精品国产精品 | 欧美一区免费 | 亚洲伦理久久 |