저는 C/pro*c 코드를 UNIX에서 Linux로 이식하고 있습니다. 코드는 다음과 같습니다
#define __NFDBIT (8 * sizeof(unsigned long))
#define __FD_SETSIZ 1024
#define __FDSET_LONG (__FD_SETSIZ/__NFDBIT)
typedef struct {
unsigned long fds_bits [__FDSET_LONG];
} __ernel_fd_set;
typedef __ernel_fd_set fd_set_1;
int main()
{
fd_set_1 listen_set;
int listen_sd;
int socket_id;
FD_ZERO(&listen_set);
socket_id = t_open("/dev/tcp", O_RDWR|O_NONBLOCK, (struct t_info *) 0);
if ( socket_id <0 )
{
exit(FAILURE);
}
return 0;
}
> 0
UNIX에서 Linux의 소켓_id 값은 입니다 -1
. 그 이유는 UNIX에는 Linux에는 /dev/tcp
. 또한 UNIX에서는 이 tcp
파일이 일반 파일과 다른 문자 특수 파일이다.
UNIX에서와 마찬가지로 Linux에서도 동일한 문자 특수 파일을 생성할 수 있는 방법이 있습니까? 아니면 추가로 진행하는 방법이 있습니까?
답변1
t_open()
그리고 그와 관련된 /dev/tcp
내용은TLI/XTI 인터페이스, TCP/IP API와 BSD 소켓 간의 전투에서 패했습니다.
Linux에는 /dev/tcp
모든 종류가 있습니다. 실제 파일이나 커널 장치가 아닙니다. 이건 물건이야배쉬 특별 제안이며 리디렉션에만 사용됩니다. 이는 커널 내부 /dev/tcp
기능이 생성되더라도 쉘의 대화형 사용이 99%[*] 차단된다는 의미입니다.
가장 좋은 해결책은 실제로 BSD 소켓으로 전환하는 것입니다. 죄송합니다.
당신은 얻을 수 있습니다스타넷XTI 에뮬레이션 레이어는 작동하지만 시간을 들여 XTI를 제거하는 것이 더 좋습니다. 이것은 죽은 API이며 Linux뿐만 아니라 BSD(OS X 포함)에서도 지원되지 않습니다.
(그런데 strxnet 라이브러리는 BSD에 의존하기 때문에 BSD를 기반으로 구축되지도 않았습니다.리튬황, Linux 커널의 구성 요소입니다. configure
GNU sed에 의존하기 때문에 일반 BSD나 OS X 시스템에서도 실행 되지 않습니다 . )
[*] 내 추측은 Bash가 내가 사용한 모든 Linux 배포판에서 루트가 아닌 사용자를 위한 기본 셸이라는 사실에 기반을 두고 있습니다. 따라서 일반적으로 Linux에서는 Bash 이외의 다른 것을 얻으려면 노력해야 합니다.