Tag: posix

使用iconv进行简单的UTF8-> UTF16字符串转换

我想写一个函数将UTF8字符串转换为UTF16(little-endian)。 问题是, iconv函数似乎不会让您事先知道存储输出字符串需要多少字节。 我的解决方案是首先分配2*strlen(utf8) ,然后在循环中运行iconv ,必要时使用realloc增加该缓冲区的大小: static int utf8_to_utf16le(char *utf8, char **utf16, int *utf16_len) { iconv_t cd; char *inbuf, *outbuf; size_t inbytesleft, outbytesleft, nchars, utf16_buf_len; cd = iconv_open(“UTF16LE”, “UTF8”); if (cd == (iconv_t)-1) { printf(“!%s: iconv_open failed: %d\n”, __func__, errno); return -1; } inbytesleft = strlen(utf8); if (inbytesleft == 0) { printf(“!%s: empty string\n”, __func__); […]

如何区分Escape和Escape Sequence

我的最终目标是区分我在键盘上按下Esc (ASCII 27 ),然后按下我键盘上的→键(转换为27 91 67的序列)。 我正在使用termios将我的终端设置为非Canonical模式。 我想我明白有两种选择: 等待一段任意的时间来看看是否有东西进入(似乎是hacky) 检查STDIN以查看它是否为空 我正在尝试做后者。 为此,我试图使用select来查看stdin是否为空。 问题 select似乎总是返回0(超时到期)。 这似乎很奇怪,原因有两个: 我想如果我在击中Esc之后没有输入任何内容,那么它将返回-1,因为它没有看到stdin中有任何东西要读 我想如果我输入→ ,那么我会得到一个1因为它看到27之后就有91和67来读 这些事情都没有发生,所以我害怕我只是不理解select或标准输入/输出就像我想的那样。 问题 为什么在我的例子中没有select返回0以外的任何东西? 是否可以检查stdin是否为空? 其他库如何处理这个? 最小,完整和可validation的示例 我在MacOS High Sierra和Ubuntu 16上运行它,结果相同。 资源: #include #include #include #include #include #include #include #include int main() { // put terminal into non-canonical mode struct termios old; struct termios new; int fd = […]

是否有符合POSIX标准的方式获取我的计算机的本地网络IP地址?

我知道这个问题已经以一种或另一种forms被问了一百万次,但没有问题给了我一个POSIX兼容的方式。 我需要获取计算机的本地网络地址, 而不使用getifaddrs或任何其他非POSIX兼容的访问接口的方式。 那可能吗 ?

Linux / POSIX等效于Win32的CreateEvent,SetEvent,WaitForSingleObject

我写了一个小类来同步Linux(实际上是Android)和Windows的线程。 这是我的界面的Win32实现: class SyncObjectWin32 : public SyncObject { private: const HANDLE m_hEvent; public: SyncObjectWin32() : m_hEvent( ::CreateEvent( NULL, FALSE, FALSE ) ) { if( NULL == m_hEvent ) throw core::Exception( “sys::SyncObjectWin32::SyncObjectWin32() – Failed to create event.” ); } ~SyncObjectWin32() { ::CloseHandle( m_hEvent ); } void WaitForSignal() { ::WaitForSingleObject( m_hEvent ); } void Signal() { ::SetEvent( […]

fallocate vs posix_fallocate

我正在讨论在posix_fallocate和fallocate之间使用哪个函数。 posix_fallocate写入文件(将字符初始化为NULL)。 但是, fallocate不会更改文件大小(使用FALLOC_FL_KEEP_SIZE标志时)。 根据我的实验,似乎fallocate不会将NULL或零字符写入文件。 有人可以根据您的经验发表评论吗? 谢谢你的时间。

退出C中的function

C中的exit() ,_ exit( )和_Exit()有什么区别? 我该如何决定使用哪个? 在bash上, 男子2出口 给了我页面_EXIT(2),而 男子3出口 给了页面EXIT(3)。

除了在现代POSIX环境中使用外,我还可以使用什么?

我是C的新手,但写了一个小的multithreading应用程序。 我想对线程引入延迟。 我一直在使用’usleep’并且行为是我想要的 – 但它会在C99中产生警告。 函数’usleep’的隐式声明 这只是一个警告,但它困扰我。 我用谷歌搜索了一个答案,但我能找到的只是一个while循环/定时器方法,看起来像是CPU密集型。 编辑: 我的包括: #include #include #include #include #include 我正在调用编译器: c99 program.c -Wall -pedantic -W -lpthread 编辑#2: 我创建了一个包含以下内容的新文件: #include int main(void) { usleep(10); } 我仍然得到警告。 编辑#3:正如所建议的,我已经更新了问题的文本。

c将几个参数传递给线程

当我创建一个线程时,我想传递几个参数。 所以我在头文件中定义以下内容: struct data{ char *palabra; char *directorio; FILE *fd; DIR *diro; struct dirent *strdir; }; 在.c文件中,我执行以下操作 if (pthread_create ( &thread_id[i], NULL, &hilos_hijos, ??? ) != 0){ perror(“Error al crear el hilo. \n”); exit(EXIT_FAILURE); } 我如何将所有这些参数传递给线程。 我虽然说: 1)首先使用malloc为此结构分配内存,然后为每个参数赋值: struct data *info info = malloc(sizeof(struct data)); info->palabra = …; 2)定义 struct data info info.palabra = … […]

检查是否错误!= EINTR:这是什么意思?

我发现这段代码多次使用(也是一个类似的代码,它使用的是open()而不是write() )。 int c = write(fd, &v, sizeof(v)); if (c == -1 && errno != EINTR) { perror(“Write to output file”); exit(EXIT_FAILURE); } 为什么检查&& errno != EINTR在这里? 寻找男人的 errno我发现了关于EINTR的以下文字,但即使我访问了man 7 signal ,也没有启发我。 EINTR中断函数调用(POSIX.1); 见信号(7)。

如何在FreeBSD中获取打开的posix共享内存段列表

在linux中,我可以通过获取/ dev / shm目录列表获得打开的posix共享内存段列表。 我如何以编程方式获取FreeBSD中所有打开的posix共享内存段的列表? 假设使用shm_open打开了段,我甚至不知道用作shm_open的第一个参数的名称的一部分。