当前位置: 首页 > 面试题库 >

ioctl给出无效的参数

商经业
2023-03-14
问题内容

我想在两个不同的程序之间发送一个打开的文件描述符。所以我用ioctlnamed pipes这样做。但是我收到了ioctl的无效参数。

#include <stropts.h>
#include "accesories.c"
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/ioctl.h>

#define MSGSIZ 63
char *fifo = "fifo";

int send_err(int fd, int errcode, const char *msg)
{
    int     n;

    if ((n = strlen(msg)) > 0)
        if (write(fd, msg, n) != n)    /* send the error message */
            return(-1);

    if (errcode >= 0)
        errcode = -1;   /* must be negative */

    if (send_fd(fd, errcode) < 0)
        return(-1);

    return(0);
}

int send_fd(int fd, int fd_to_send)
{
    char    buf[2];     /* send_fd()/recv_fd() 2-byte protocol */

    buf[0] = 0;         /* null byte flag to recv_fd() */
    if (fd_to_send < 0) {
        buf[1] = -fd_to_send;   /* nonzero status means error */
        if (buf[1] == 0)
            buf[1] = 1; /* -256, etc. would screw up protocol */
    } else {
        buf[1] = 0;     /* zero status means OK */
    }
    //printf("From the write %d\n",buf[0]);
    if (write(fd, buf, 2) != 2)
        return(-1);

    if (fd_to_send >= 0)
        if (ioctl(fd, I_SENDFD, fd_to_send) < 0)
        {
            printf("Eroor ::: %s\n",strerror(errno));
            return(-1);
        }
    return(0);
}




int main(int argc, char const *argv[])
{
    int fd, j, nwrite;
    char msgbuf[MSGSIZ+1];
    int fd_to_send;


    if((fd_to_send = open("vi",O_RDONLY)) < 0)
        printf("vi open failed");

    if(argc < 2)
    {
        fprintf(stderr, "Usage: sendmessage msg ... \n");
        exit(1);
    }
    /* open fifo with O_NONBLOCK set */
    if((fd = open(fifo, O_WRONLY | O_NONBLOCK)) < 0)
        printf("fifo open failed");

    /* send messages */
    for (j = 1; j < argc; j++)
    {
        if(strlen(argv[j]) > MSGSIZ)
        {
            fprintf(stderr, "message too long %s\n", argv[j]);
            continue;
        }
        strcpy(msgbuf, argv[j]);
        if((nwrite = write(fd, msgbuf, 6)) == -1)
            printf("message write failed");
    }

    printf("From send_fd %d \n",send_fd(fd,fd_to_send));

    exit(0);

}

文件附件.h仅包含一些常见的包含文件,而没有其他内容。首先,我发送一条简单的消息,然后调用send_fd该方法,该方法首先发送2字节消息,然后必须使用ioctl发送文件描述符。但事实并非如此。


问题答案:

看来linux不支持I_SENDFD。注释表明该I_SENDFD内容在文档中,但实际上不受支持,并会导致您遇到错误消息。用于STREAMS的Wikipedia条目指出linux内核对流没有任何支持。Wikipedia条目的确指向了几个可以用于添加流支持的第三方软件包,但是LiS尚未移植到2.6内核,并且OpenSS7在4年内没有任何活跃的开发。

但是,Linux确实支持类似的功能。此机制使用特殊的消息类型SCM_RIGHTS在UNIX域套接字上使用sendmsg并从中获取文件描述符recvmsg。可以通过简单的Web搜索找到示例,完整的示例似乎来自
《 Linux编程接口
》一书,其中包含发送和接收的信息。



 类似资料:
  • 描述 (Description) 此函数使用系统函数ioctl()执行函数FUNCTION,使用SCALAR在适当时设置或接收信息。 FUNCTION的可用值完全独立于系统。 对于合适的值,您应该参考您的ioctl.h C头文件(如果有的话)。 语法 (Syntax) 以下是此函数的简单语法 - ioctl FILEHANDLE, FUNCTION, SCALAR 返回值 (Return Val

  • 我在Windows机器上用Java8编译测试时遇到了问题。当我在IntelliJ IDE中编译和运行测试时没有问题,但是当我在命令行上编译时,我得到一个“编译时的致命错误:无效的目标版本:1.8” 这样做很好: 这将失败: My pom.xml包含以下编译器插件配置: 任何帮助都将不胜感激。

  • 问题内容: 有人知道为什么chrome参数不起作用吗? 我也尝试过在切换台之前不加“-”并仅给出一个参数… Chrome启动,但没有激活的标志。 我使用最新的chromedriver。 问题答案: 我最近发现的类不与当前的硒和铬出于某种原因(如硒2.33.0,铬30和2013年7月)正常工作。 我相信,我链接的答案也是您解决问题的方法。只需使用,这些对我来说一直很好:

  • 我想让它在每天每小时的第5,15,25,35,45和55分钟运行。这似乎与这里的AWS调度事件文档一致http://docs.AWS.amazon.com/amazoncloudwatch/latest/Events/scheduledevents.html。 上面的文档允许用0到59之间的逗号分隔值表示分钟,并使用*通配符反映小时、月日(或周日)、月和年。 我尝试在Lambda控制台(创建函数并

  • 我正在上载excel工作表,并希望将其数据移动到数据库中的另一个表中。最近两天我收到了一个错误(),但是,如果我设计了一个非常简单的应用程序,它就可以正常工作。请帮帮我

  • 当我试图从我的api中点击以从keydove对用户进行身份验证时,它给了我一个错误无效参数:keydove页面上的redirect_uri。除了师父,我创造了自己的王国。KeyClope正在http上运行。请帮帮我。