MacOSX(类FreeBSD?)的坑

来源:互联网 发布:win10 数据恢复 编辑:程序博客网 时间:2024/05/19 22:57
不知道这是bug还是缺陷:/dev/tty为当前控制台,所以,echo "hello world" > /dev/tty 都能在控制台(伪终端)打印出 hello world 字符,那么我们写个程序输出到标准输出文件描述符STDOUT_FILENO(:=1)时,在控制台重定位如上面那句命令行一样,应该也能输出到控制台。可惜的是,这似乎对于POSIX AIO并不成立,如下程序在Linux下都能成功,但是在MacOSX下就失败。我们编译并重定向这个程序(这个得有APUE头文件和库文件),./a.out >/dev/tty 竟然是:

w???Input/output error: Undefined error: 0

也就是说在aio_error中失败了。但是同样的程序可以在Linux下成功,后来在MacOSX下重定向为/dev/ttys001,同样,虽然能够输出但是在aio_suspend中失败了。

看来异步IO的操作系统底层支持度还是非常不一样的。(Ubuntu中需要连接 -lrt编译,而MacOSX下无需多余连接)

#include "apue.h"#include <ctype.h>#include <fcntl.h>#include <aio.h>#include <errno.h>char buf[100];const struct aiocb * list[1];int main(int argc, char const *argv[]){    int a = 'a';    int res;    for (int i = 0; i < 10; ++i)    {        /* code */        buf[i] = a;        a++;    }    struct aiocb ab;    ab.aio_fildes = 1;    ab.aio_offset = 0;    ab.aio_buf = buf;    ab.aio_nbytes = 1;    ab.aio_sigevent.sigev_notify = SIGEV_NONE;    list[0] = &ab;AGAIN:    if(aio_write(&ab)<0)        err_sys("aio write error");CHECK:    if((res = aio_error(&ab) )!= 0)    {        if(res != EINPROGRESS)            err_sys("w???%s",strerror(res));        goto CHECK;    }    if((res = aio_return(&ab) ) < 0 )    {        fprintf(stderr, "write :%d\n", res);        goto AGAIN;    }    if(aio_suspend(list, 1, NULL) < 0 )        err_sys("aio suspend error");    fprintf(stderr,"ok\n");    return 0;}

0 0
原创粉丝点击