linux c fcntl函数返回值

if((val = fcntl(fd,F_GETFL,0))<0)
.......

val  |=  O_NONBLOCK;

if(fcntl(fd,F_SETFL,val)<0)

    .......

设置非阻塞。
第三行为什么能这样设,val不是反回文件描述符fd么?

fcntl函数原型为:int fcntl(int fd, int cmd, long arg);
其中cmd支持的命令有多种,其中设置文件描述词的状态,可选的类型有O_APPEND、O_NONBLOCK和O_ASYNC,其中O_NONBLOCK表示设置非阻塞。

fcntl的返回值与命令有关。如果出错,所有命令都返回-1,如果成功则返回某个其他值。下列四个命令有特定返回值:F_DUPFD、F_GETFD、F_GETFL、F_GETOWN.第一个返回新的文件描述符,接下来的两个返回相应标志,最后一个返回一个正的进程ID或负的进程组ID。

所以可以以小于0 来判断