我正在为类编写发送器/读取器IPC C程序,并且我在将O_NONBLOCK标志设置为0时遇到问题,以便我的读取器在尝试读取的缓冲区为空时将阻塞。以下是我正在使用的功能:
int set_nonblock_flag(int desc, int value)
{
int oldflags = fcntl(desc, F_GETFL, 0);
if (oldflags == -1)
return -1;
if (value != 0)
oldflags |= O_NONBLOCK;
else
oldflags &= ~O_NONBLOCK;
return fcntl(desc, F_SETFL, oldflags);
}
主要()
main ()
{
int fd[2], nbytes;
char readbuff[26];
int r_pid = 0;
int s_pid = 0;
/* THIS IS ALL UPDATED!*/
fd[0] = open("fd.txt",O_RDONLY);
fd[1] = open("fd.txt",O_WRONLY);
set_nonblock_flag(fd[0], 0);
set_nonblock_flag(fd[1], 0);
/* END UPDATES */
pipe(fd);
r_pid = fork();
if (r_pid < 0) /* error */
{
fprintf( stderr, "Failed to fork receiver\n" );
exit( -1 );
}
else if (r_pid == 0) /* this is the receiver */
{
fprintf( stdout, "I, %d am the receiver!\n", getpid() );
close( fd[1] ); /* close write end */
nbytes = read( fd[0], readbuff, 1 );
printf ("nonblocking flag = %d\n", fcntl(fd, F_GETFL, 0));
printf ("Nbytes read: %d\n", nbytes );
}
... /* rest of function removed */
行printf ("nonblocking flag = %d\n", fcntl(fd, F_GETFL, 0));
只返回-1作为标志状态。如果它被清除,它不应该是0吗?
答案 0 :(得分:2)
您正在使用第一个参数作为整数数组调用set_nonblock_flag。 这是fcntl联机帮助页的一个片段。第一个参数应该是文件描述符。
概要
#include <fcntl.h> int fcntl(int fildes, int cmd, ...);
说明
fcntl()函数应在打开的文件上执行下面描述的操作。 fildes参数是一个文件 描述符。
我想你想先调用pipe然后调用set_nonblock_flag。所以,我认为你真正想要的是以下内容:
int fd[2];
...
pipe(fd);
set_nonblock_flag(fd[0], 0);