Utiliser mount en c++ api en C,

hello

j’essaye d’avoir l’équivalant de :

en C:

#include <sys/mount.h> //montage
#include <linux/fs.h> //montage
#include <errno.h> //gestion des erreur
#include <string.h> //gestion des erreur

if (mount("/home/mnt1", "/home/mnt2", "--bind", MS_BIND ,"rw,defaults,blksize=4096") != 0)
   {
        fprintf(stderr, "%s\n", strerror(errno));
   }
else
   {
	return "répertoire monté ?";
   }

et j’obtien :répertoire monté ?

cependant il n’en est rien, donc pas d’erreur je comprend pas pourquoi sa ne monte pas (j’ai tester en root et les 2 répertoire existe)
une idée ?

voila les info que j’ai suposer utile de fournir:

 cat de /etc/mtab
cat: de: Aucun fichier ou répertoire de ce type
/dev/sda5 / ext3 rw,errors=remount-ro 0 0
tmpfs /lib/init/rw tmpfs rw,nosuid,mode=0755 0 0
proc /proc proc rw,noexec,nosuid,nodev 0 0
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
procbususb /proc/bus/usb usbfs rw 0 0
udev /dev tmpfs rw,mode=0755 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,noexec,nosuid,gid=5,mode=620 0 0
/dev/sda7 /home ext3 rw 0 0
tmpfs /home/tnt/volatile tmpfs rw,size=5m,nr_inodes=10k,mode=0755 0 0


at /proc/mounts
rootfs / rootfs rw 0 0
none /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
none /proc proc rw,nosuid,nodev,noexec,relatime 0 0
udev /dev tmpfs rw,relatime,size=10240k,mode=755 0 0
/dev/sda5 / ext3 rw,relatime,errors=remount-ro,data=ordered 0 0
tmpfs /lib/init/rw tmpfs rw,nosuid,relatime,mode=755 0 0
usbfs /proc/bus/usb usbfs rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev,relatime 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
/dev/sda7 /home ext3 rw,relatime,errors=continue,data=ordered 0 0
tmpfs /home/tnt/volatile tmpfs rw,relatime,size=5120k,nr_inodes=10240,mode=755 0 0
/dev/sda7 /home/mnt2 ext3 rw,relatime,errors=continue,data=ordered 0 0
/dev/sda7 /home/mnt2 ext3 rw,relatime,errors=continue,data=ordered 0 0


cat /proc/self/mountinfo
13 17 0:0 / /sys rw,nosuid,nodev,noexec,relatime - sysfs none rw
14 17 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc none rw
15 17 0:13 / /dev rw,relatime - tmpfs udev rw,size=10240k,mode=755
17 1 8:5 / / rw,relatime - ext3 /dev/sda5 rw,errors=remount-ro,data=ordered
18 17 0:15 / /lib/init/rw rw,nosuid,relatime - tmpfs tmpfs rw,mode=755
19 14 0:14 / /proc/bus/usb rw,nosuid,nodev,noexec,relatime - usbfs usbfs rw
20 15 0:16 / /dev/shm rw,nosuid,nodev,relatime - tmpfs tmpfs rw
21 15 0:10 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=000
22 17 8:7 / /home rw,relatime - ext3 /dev/sda7 rw,errors=continue,data=ordered
23 22 0:17 / /home/tnt/volatile rw,relatime - tmpfs tmpfs rw,size=5120k,nr_inodes=10240,mode=755
24 22 8:7 /mnt1 /home/mnt2 rw,relatime - ext3 /dev/sda7 rw,errors=continue,data=ordered
25 24 8:7 /mnt1 /home/mnt2 rw,relatime - ext3 /dev/sda7 rw,errors=continue,data=ordered


# mount
/dev/sda5 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
procbususb on /proc/bus/usb type usbfs (rw)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sda7 on /home type ext3 (rw)
tmpfs on /home/tnt/volatile type tmpfs (rw,size=5m,nr_inodes=10k,mode=0755)

merci d’avance

tu execute ton appli en root ?

Première chose, ton code n’est pas compilable. C’est pas très grave en soi, mais ça m’aurait évité de perdre du temps à le corriger pour pouvoir le tester.

Deuxième chose, l’appel à mount tel que tu l’as écrit fonctionne très bien chez moi. La seule modification que j’aie faite concerne, bien entendu, le chemin des répertoires.

Enfin, en ce qui concerne le style :

[quote]MS_BIND
(Linux 2.4 onwards) Perform a bind mount, making a file or a directory subtree visible at another point within a file system. Bind mounts may cross file system boundaries and span chroot(2) jails. The filesystemtype, mountflags, and data arguments are ignored.[/quote]
Puisque ces arguments sont ignorés, tu ferais mieux de mettre filesystemtype et data à 0 (NULL) pour plus de clarté.

Aussi, le troisième argument est censé être le type de filesystem (ext2, ext3, …) alors que toi tu passes “–bind”, ce qui n’a aucun sens (non pas que ça impacte le résultat de la fonction dans ce cas précis, mais avec d’autres mountflags ça serait un problème).

Forcément, sinon ça retourne un EPERM (Operation not permitted).

[quote=“syam”]Première chose, ton code n’est pas compilable. C’est pas très grave en soi, mais ça m’aurait évité de perdre du temps à le corriger pour pouvoir le tester.
[/quote]
désoler je voulai pas inclure du code qui n’a rien a voire, j’aurai du ajouter le main simplement :smt005

oui mai mount ne renvoiye rien, donc bug de mount ?

chose faite (voir plus bas)

je confirme: voila le code:modifier

#include <string> //code c++
#include <sys/mount.h> //montage
#include <linux/fs.h> //montage
#include <errno.h> //gestion des erreur
#include <string.h> //gestion des erreur
int main()
{
     std::string Ret;
     if (mount("/home/mnt1", "/home/mnt2", NULL, MS_BIND ,NULL) != 0)
    {
        fprintf(stderr, "%s\n", strerror(errno));
        Ret="erreur";
    }
    else
    {

    	Ret="répertoire monté ?"; 
                

std::cout << Ret << std::endl; //code c++,pour le C utiliser le fprintf 
}

donc ou je peux voire que c’est monter,vu que mount me donne rien ?
je supose que c’est /proc/mounts qui est fiable , mai alors je le lis comme un fichier normal ?

encore une question est-ce possible de monter un disque en mémoire (un répertoire)
comme tmpfs on /home/mnt3/volatile type tmpfs (rw,size=5m,nr_inodes=10k,mode=0755) ce qui donne un disque de 5mg en rame ou on peux y mettre des fichier.
car j’ai pas trouver la syntaxe pour le faire ?

Merci pour ta réponse.

[code]#include <sys/mount.h> //montage
#include <linux/fs.h> //montage
#include <errno.h> //gestion des erreur
#include <string.h> //gestion des erreur
// Séparer les « include » C et C++
#include //code c++
#include

int main()
{
using namespace std; // ça permet d’être moins verbeux
string Ret;

if (mount("/home/mnt1", “/home/mnt2”, NULL, MS_BIND ,NULL) != 0){
cerr << strerror(errno) << endl; // Autant ne pas mélanger le C et le C++ outremesure
Ret=“erreur”;
}
else{
Ret=“répertoire monté ?”;
}
cout << Ret << endl; //code c++,pour le C utiliser le fprintf
}[/code]
Ton répertoire de destination est il vide ?

oui.
bon en fait mount n’affiche rien mai le répertoire est bien monter … bref je vai l’utiliser mai par contre sa serai bien de mettre a jours mount en meme temps mai je ne sai pas qu’elle fichier il va lire.

Merci pour ta réponse

oui.
bon en fait mount n’affiche rien mai le répertoire est bien monter … bref je vai l’utiliser mai par contre sa serai bien de mettre a jours mount en même temps mai je ne sai pas qu’elle fichier il va lire.

pour le répertoire en ram je cherche toujours par contre.
Merci pour ta réponse