LINUX.ORG.RU

Блокировка ioctl

 , ,


0

4

Почему может блокироваться ioctl на участке кода:

int sd;

sd = socket(AF_INET, SOCK_DGRAM, 0); DBG("socket : %i\n", sd);

if(sd > 0)
{
	struct ifconf ifconf;
	struct ifreq ifreq[CFG_NETWORK_MAXIFCS]={0};
	int interfaces;
	int i,rc;

	memset(&ifconf, 0, sizeof(struct ifconf));

	// Point ifconf's ifc_buf to our array of interface ifreqs.
	//ifconf.ifc_buf = (char *) ifreq;
	ifconf.ifc_ifcu.ifcu_buf = (caddr_t)ifreq;

	// Set ifconf's ifc_len to the length of our array of interface ifreqs.
	ifconf.ifc_len = sizeof(ifreq);

	DBG("ioctl start: %u\n", ifconf.ifc_len );

	//  Populate ifconf.ifc_buf (ifreq) with a list of interface names and addresses.
	if ((rc=ioctl(sd, SIOCGIFCONF, &ifconf)) < 0 )
	{
		DBG("ioctl error: %i\n", rc );
		goto error;
	}

	DBG("ioctl complete\n");

т.е. ни «ioctl complete», ни «ioctl error: » не печатаются, поток виснет.

После этого ifconfig также начинает виснуть

?


у тебя же там правильный кусок закомментирован:

ifconf.ifc_buf = (caddr_t)ifreq;

с ним должно работать. ну, ещё надо проверить, чему там у тебя равен CFG_NETWORK_MAXFCS. может, он нулевой вообще.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от zudwa

я у себя конкретно этот код проверила - всё работает. может, у тебя кернел древний или какой-то специфический?

P.S. я для теста размер буфера поставила 4096

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от zudwa

может, кернел какой-то кривой?

можешь попробовать через функции netdevice (first_net_device, next_net_device). но если это кривой кернел, то не поможет.

Iron_Bug ★★★★★
()

Ну так потрассируй ядро, лол. Возьми trace-cmd и посмотри, что там происходит, когда ты зовешь ioctl.

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.