为什么FT_Read()在subprocess中失败,但在父进程中工作?

我有以下程序,它使用ftd2xx库向USB设备写入一个字节,然后读取答复。

#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <stdarg.h> #include "../ftd2xx.h" void fatal (const char *format,...) { va_list argp; fprintf(stderr, "FATAL: "); va_start(argp, format); vfprintf(stderr, format, argp); va_end(argp); fprintf(stderr, "\n"); exit(3); } int main(int argc, char* argv[]) { int pid = fork(); if (pid > 0) { //replace with: if (pid == 0) { FT_STATUS ftStatus; printf("before FT_OpenEx\n"); FT_HANDLE ftHandle; if ((ftStatus = FT_OpenEx("DA011SCV", FT_OPEN_BY_SERIAL_NUMBER, &ftHandle)) != FT_OK) fatal("FT_OpenEx failed"); printf("before FT_Write\n"); uint8_t buffer[1]; buffer[0] = 0x55; DWORD bytesWritten; if ((ftStatus = FT_Write(ftHandle, buffer, sizeof(buffer), &bytesWritten)) != FT_OK) fatal("FT_Write failed"); printf("before FT_Read\n"); DWORD bytesRead; if ((ftStatus = FT_Read(ftHandle, buffer, 1, &bytesRead)) != FT_OK) fatal("FT_Read failed"); if (bytesRead > 0) { printf("FT_Read data=0x%02X\n", buffer[0]); } else { printf("FT_Read no data\n"); } printf("before FT_Close\n"); if ((ftStatus = FT_Close(ftHandle)) != FT_OK) fatal("FT_Close failed"); printf("press Enter to exit\n"); } getchar(); exit(0); } 

所示的代码产生这个输出:

 //Output if (pid > 0) before FT_OpenEx before FT_Write before FT_Read FT_Read data=0x55 before FT_Close press Enter to exit 

但是,如果我改变从第一个if (pid > 0)(pid == 0) ,也就是说如果我在subprocess中进行USB通信,那么程序挂在FT_Read()函数中,输出是:

 //Output if (pid == 0) before FT_OpenEx before FT_Write before FT_Read 

为什么会这样呢?

一些细节:

  • 该设备中的USB芯片是出厂设置的FT240X。
  • USB设备就像一个回声:它收到的每个字节都立即发回。
  • 我用协议分析器检查发送的字节值是否正确。
  • ftd2xx库版本是1.1.12。

Solutions Collecting From Web of "为什么FT_Read()在subprocess中失败,但在父进程中工作?"

你所描述的听起来像是在ftd2xx库中有一个错误 – 当它被加载时,库可能会执行一些初始化,当进程ID改变时,它将变为无效。

ftd2xx库是封闭源代码,并且根据禁止反向工程的许可证分发,因此我无法确定发生了什么事情。 您可能想尝试使用开放源代码的FTDI库(如libftdi )。

图书馆很奇怪 – 我有同样的问题。 对我来说,它有助于在调用fork()之后动态加载库。 查看这篇文章https://stackoverflow.com/a/7626550/907675 ,看看如何从库中动态加载函数。