知識社群登入
位置: 艾鍗學院 Blog > 專業論壇 > 討論
ioctl 應用
1樓
想請問老師,是否可以透過ioctl 取得想讀取的檔案之名稱??

查閱許多block device的ioctl cmd都無消息。

感謝~
2樓
找到可以用readdir 讀取目錄下所有檔案名稱。

但若透過socket傳送檔案,要如何知道對方傳送檔案之名稱??

3樓

 要自己設計 protocol ,
  先傳 string 檔名過去!
4樓
5樓
感謝老師相助。

目前碰到問題是在compile時,出現以下兩個warning

implicit declaration of function `telldir'
implicit declaration of function `seekdir'

我的compile指令如下:

/opt/buildroot-gcc342/bin/mipsel-linux-uclibc-gcc main.c command.c json-c.c RW_HDD.c -I /home/sean/桌面/MT7620A_firmware/Include/ -L /home/sean/桌面/RT288x_SDK/source/romfs/lib/ /home/sean/桌面/MT7620A_firmware/Lib -lphread -ljson -lIOTCAPIs -lRDTAPIs -o sean_test -std=c99

是否缺少動態連結所需lib ??


6樓
看kernel include的 header檔。

發現使用GNU編譯,不支援seekdir、telldir。

而是用scandir取代..

真麻煩..
7樓
還是出現相同warning..

implicit declaration of function `scandir'

發瘋啦~
8樓

 scandir'()   , 
 利用 opendir, readdir(), 就可以做到了..

函式庫原始碼
 

int scandir(const char *dir, struct dirent ***namelist, 
	int (*selector) (const struct dirent *),
	int (*compar) (const void *, const void *))
{
    DIR *dp = opendir (dir);
    struct dirent *current;
    struct dirent **names = NULL;
    size_t names_size = 0, pos;
    int save;

    if (dp == NULL)
	return -1;

    save = errno;
    __set_errno (0);

    pos = 0;
    while ((current = readdir (dp)) != NULL)
	if (selector == NULL || (*selector) (current))
	{
	    struct dirent *vnew;
	    size_t dsize;

	    /* Ignore errors from selector or readdir */
	    __set_errno (0);

	    if (unlikely(pos == names_size))
	    {
		struct dirent **new;
		if (names_size == 0)
		    names_size = 10;
		else
		    names_size *= 2;
		new = (struct dirent **) realloc (names, names_size * sizeof (struct dirent *));
		if (new == NULL)
		    break;
		names = new;
	    }

	    dsize = &current->d_name[_D_ALLOC_NAMLEN (current)] - (char *) current;
	    vnew = (struct dirent *) malloc (dsize);
	    if (vnew == NULL)
		break;

	    names[pos++] = (struct dirent *) memcpy (vnew, current, dsize);
	}

    if (unlikely(errno != 0))
    {
	save = errno;
	closedir (dp);
	while (pos > 0)
	    free (names[--pos]);
	free (names);
	__set_errno (save);
	return -1;
    }

    closedir (dp);
    __set_errno (save);

    /* Sort the list if we have a comparison function to sort with.  */
    if (compar != NULL)
	qsort (names, pos, sizeof (struct dirent *), compar);
    *namelist = names;
    return pos;
}
 
9樓
感謝老師相助。

我發現把compile 指令後面的 -std=c99 砍掉,就不會出現warning~

若不加,不知道是否在run time時,出現error..