1

VxWorks 设置 FIONBIO 的标准方法是使用ioctl(),而不是fcntl()。FIONBIO 的文档以此为例,显然不会编译,因为on没有数据类型:

on = TRUE;
status = ioctl (sFd, FIONBIO, &on);

我在网上看到过使用类似这样的东西(本质上是相同的东西)的示例用法:

int on = 1;
ioctl(fd, FIONBIO, &on);

但是,文档说原型ioctl()ioctl(int, int, int),我收到有关无法转换int*为的错误int。如果我将值作为 传递int,我只会得到一个致命的内核任务级异常。

这是我当前的代码:

int SetBlocking(int sockfd, bool blocking)
{
  int nonblock = !blocking;
  return ioctl(sockfd, FIONBIO, &nonblock);
}

返回错误:

error: invalid conversion from `int*' to `int'
initializing argument 3 of `int ioctl(int, int, int)'
4

2 回答 2

2

此链接http://publib.boulder.ibm.com/infocenter/tpfhelp/current/index.jsp?topic=%2Fcom.ibm.ztpf-ztpfdf.doc_put.cur%2Fgtpc2%2Fcpp_ioctl.html建议

 return ioctl(sockfd, FIONBIO, (char*) &nonblock);
于 2012-07-25T16:24:56.223 回答
1

在这里找到它。

看起来我只需要投射int*to int。我不能使用 c 风格的转换,所以我使用了reinterpret_cast.

int SetBlocking(int sockfd, bool blocking)
{
  int nonblock = !blocking;

  return ioctl(sockfd,
    FIONBIO,
    reinterpret_cast<int>(&nonblock));
}
于 2012-07-25T16:50:53.227 回答