Detect if USB disk is mounted in C application in Linux

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP












1















I would like to check if USB disk is mounted in a C application. I know that in a script I can accomplish this via mount | grep /mnt (the mount point where udev mounts the USB drive) but I need to do this in a C application. Earlier I used to accomplish this using system("sh script.sh") but doing this is causing some serious issues as this code runs in a very time critical thread.










share|improve this question



















  • 1





    you're not telling what system you're using; on Linux you have all the info you need in the /proc/self/mountinfo file, which you can read with fgets/sscanf. see the procfs(5) manpage.

    – mosvy
    Jan 29 at 5:05












  • Sorry. Added that this is required for a Linux application

    – OpenSourceEnthusiast
    Jan 29 at 5:06






  • 1





    then go on and read /proc/self/mountinfo -- that's what findmnt(8) is doing, too.

    – mosvy
    Jan 29 at 5:09












  • See also: stackoverflow.com/questions/9280759/…

    – J. Taylor
    Jan 29 at 5:09















1















I would like to check if USB disk is mounted in a C application. I know that in a script I can accomplish this via mount | grep /mnt (the mount point where udev mounts the USB drive) but I need to do this in a C application. Earlier I used to accomplish this using system("sh script.sh") but doing this is causing some serious issues as this code runs in a very time critical thread.










share|improve this question



















  • 1





    you're not telling what system you're using; on Linux you have all the info you need in the /proc/self/mountinfo file, which you can read with fgets/sscanf. see the procfs(5) manpage.

    – mosvy
    Jan 29 at 5:05












  • Sorry. Added that this is required for a Linux application

    – OpenSourceEnthusiast
    Jan 29 at 5:06






  • 1





    then go on and read /proc/self/mountinfo -- that's what findmnt(8) is doing, too.

    – mosvy
    Jan 29 at 5:09












  • See also: stackoverflow.com/questions/9280759/…

    – J. Taylor
    Jan 29 at 5:09













1












1








1


1






I would like to check if USB disk is mounted in a C application. I know that in a script I can accomplish this via mount | grep /mnt (the mount point where udev mounts the USB drive) but I need to do this in a C application. Earlier I used to accomplish this using system("sh script.sh") but doing this is causing some serious issues as this code runs in a very time critical thread.










share|improve this question
















I would like to check if USB disk is mounted in a C application. I know that in a script I can accomplish this via mount | grep /mnt (the mount point where udev mounts the USB drive) but I need to do this in a C application. Earlier I used to accomplish this using system("sh script.sh") but doing this is causing some serious issues as this code runs in a very time critical thread.







mount usb c real-time






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 29 at 6:30









jsotola

13716




13716










asked Jan 29 at 4:53









OpenSourceEnthusiastOpenSourceEnthusiast

366




366







  • 1





    you're not telling what system you're using; on Linux you have all the info you need in the /proc/self/mountinfo file, which you can read with fgets/sscanf. see the procfs(5) manpage.

    – mosvy
    Jan 29 at 5:05












  • Sorry. Added that this is required for a Linux application

    – OpenSourceEnthusiast
    Jan 29 at 5:06






  • 1





    then go on and read /proc/self/mountinfo -- that's what findmnt(8) is doing, too.

    – mosvy
    Jan 29 at 5:09












  • See also: stackoverflow.com/questions/9280759/…

    – J. Taylor
    Jan 29 at 5:09












  • 1





    you're not telling what system you're using; on Linux you have all the info you need in the /proc/self/mountinfo file, which you can read with fgets/sscanf. see the procfs(5) manpage.

    – mosvy
    Jan 29 at 5:05












  • Sorry. Added that this is required for a Linux application

    – OpenSourceEnthusiast
    Jan 29 at 5:06






  • 1





    then go on and read /proc/self/mountinfo -- that's what findmnt(8) is doing, too.

    – mosvy
    Jan 29 at 5:09












  • See also: stackoverflow.com/questions/9280759/…

    – J. Taylor
    Jan 29 at 5:09







1




1





you're not telling what system you're using; on Linux you have all the info you need in the /proc/self/mountinfo file, which you can read with fgets/sscanf. see the procfs(5) manpage.

– mosvy
Jan 29 at 5:05






you're not telling what system you're using; on Linux you have all the info you need in the /proc/self/mountinfo file, which you can read with fgets/sscanf. see the procfs(5) manpage.

– mosvy
Jan 29 at 5:05














Sorry. Added that this is required for a Linux application

– OpenSourceEnthusiast
Jan 29 at 5:06





Sorry. Added that this is required for a Linux application

– OpenSourceEnthusiast
Jan 29 at 5:06




1




1





then go on and read /proc/self/mountinfo -- that's what findmnt(8) is doing, too.

– mosvy
Jan 29 at 5:09






then go on and read /proc/self/mountinfo -- that's what findmnt(8) is doing, too.

– mosvy
Jan 29 at 5:09














See also: stackoverflow.com/questions/9280759/…

– J. Taylor
Jan 29 at 5:09





See also: stackoverflow.com/questions/9280759/…

– J. Taylor
Jan 29 at 5:09










1 Answer
1






active

oldest

votes


















1














If you need to check the full list of mount points, use getmntent(3) or its thread-safe GNU extension getmntent_r(3).



If you just want to quickly check whether a given directory has a filesystem mounted on it or not, then use one of the functions in the stat(2) family. For example, if you want to check if /mnt has a filesystem mounted or not, you could do something like this:



#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

struct stat mountpoint;
struct stat parent;

/* Get the stat structure of the directory...*/
if stat("/mnt", &mountpoint) == -1)
perror("failed to stat mountpoint:");
exit(EXIT_FAILURE);


/* ... and its parent. */
if stat("/mnt/..", &parent) == -1)
perror("failed to stat parent:");
exit(EXIT_FAILURE);


/* Compare the st_dev fields in the results: if they are
equal, then both the directory and its parent belong
to the same filesystem, and so the directory is not
currently a mount point.
*/
if (mountpoint.st_dev == parent.st_dev)
printf("No, there is nothing mounted in that directory.n");
else
printf("Yes, there is currently a filesystem mounted.n");






share|improve this answer























  • I would advise against using getmnent() &co. First, they're not able to parse /proc/self/mountinfo (which contains info beyond /etc/mtab), second, there's no guarantee that the info they're returning is up to date, and third the format of the file is simple enough to be parsed with sscanf (the only complication is translating octal sequences eg. 12 for newline in paths, but even that could be easily done in place with 2 lines of C). It's not worth the trouble to deal with the ornery getmntent() interface, ever.

    – mosvy
    Jan 29 at 16:08












  • What else do you suggest to use instead of getmnent()

    – OpenSourceEnthusiast
    Feb 7 at 4:21










Your Answer








StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "106"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f497351%2fdetect-if-usb-disk-is-mounted-in-c-application-in-linux%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









1














If you need to check the full list of mount points, use getmntent(3) or its thread-safe GNU extension getmntent_r(3).



If you just want to quickly check whether a given directory has a filesystem mounted on it or not, then use one of the functions in the stat(2) family. For example, if you want to check if /mnt has a filesystem mounted or not, you could do something like this:



#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

struct stat mountpoint;
struct stat parent;

/* Get the stat structure of the directory...*/
if stat("/mnt", &mountpoint) == -1)
perror("failed to stat mountpoint:");
exit(EXIT_FAILURE);


/* ... and its parent. */
if stat("/mnt/..", &parent) == -1)
perror("failed to stat parent:");
exit(EXIT_FAILURE);


/* Compare the st_dev fields in the results: if they are
equal, then both the directory and its parent belong
to the same filesystem, and so the directory is not
currently a mount point.
*/
if (mountpoint.st_dev == parent.st_dev)
printf("No, there is nothing mounted in that directory.n");
else
printf("Yes, there is currently a filesystem mounted.n");






share|improve this answer























  • I would advise against using getmnent() &co. First, they're not able to parse /proc/self/mountinfo (which contains info beyond /etc/mtab), second, there's no guarantee that the info they're returning is up to date, and third the format of the file is simple enough to be parsed with sscanf (the only complication is translating octal sequences eg. 12 for newline in paths, but even that could be easily done in place with 2 lines of C). It's not worth the trouble to deal with the ornery getmntent() interface, ever.

    – mosvy
    Jan 29 at 16:08












  • What else do you suggest to use instead of getmnent()

    – OpenSourceEnthusiast
    Feb 7 at 4:21















1














If you need to check the full list of mount points, use getmntent(3) or its thread-safe GNU extension getmntent_r(3).



If you just want to quickly check whether a given directory has a filesystem mounted on it or not, then use one of the functions in the stat(2) family. For example, if you want to check if /mnt has a filesystem mounted or not, you could do something like this:



#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

struct stat mountpoint;
struct stat parent;

/* Get the stat structure of the directory...*/
if stat("/mnt", &mountpoint) == -1)
perror("failed to stat mountpoint:");
exit(EXIT_FAILURE);


/* ... and its parent. */
if stat("/mnt/..", &parent) == -1)
perror("failed to stat parent:");
exit(EXIT_FAILURE);


/* Compare the st_dev fields in the results: if they are
equal, then both the directory and its parent belong
to the same filesystem, and so the directory is not
currently a mount point.
*/
if (mountpoint.st_dev == parent.st_dev)
printf("No, there is nothing mounted in that directory.n");
else
printf("Yes, there is currently a filesystem mounted.n");






share|improve this answer























  • I would advise against using getmnent() &co. First, they're not able to parse /proc/self/mountinfo (which contains info beyond /etc/mtab), second, there's no guarantee that the info they're returning is up to date, and third the format of the file is simple enough to be parsed with sscanf (the only complication is translating octal sequences eg. 12 for newline in paths, but even that could be easily done in place with 2 lines of C). It's not worth the trouble to deal with the ornery getmntent() interface, ever.

    – mosvy
    Jan 29 at 16:08












  • What else do you suggest to use instead of getmnent()

    – OpenSourceEnthusiast
    Feb 7 at 4:21













1












1








1







If you need to check the full list of mount points, use getmntent(3) or its thread-safe GNU extension getmntent_r(3).



If you just want to quickly check whether a given directory has a filesystem mounted on it or not, then use one of the functions in the stat(2) family. For example, if you want to check if /mnt has a filesystem mounted or not, you could do something like this:



#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

struct stat mountpoint;
struct stat parent;

/* Get the stat structure of the directory...*/
if stat("/mnt", &mountpoint) == -1)
perror("failed to stat mountpoint:");
exit(EXIT_FAILURE);


/* ... and its parent. */
if stat("/mnt/..", &parent) == -1)
perror("failed to stat parent:");
exit(EXIT_FAILURE);


/* Compare the st_dev fields in the results: if they are
equal, then both the directory and its parent belong
to the same filesystem, and so the directory is not
currently a mount point.
*/
if (mountpoint.st_dev == parent.st_dev)
printf("No, there is nothing mounted in that directory.n");
else
printf("Yes, there is currently a filesystem mounted.n");






share|improve this answer













If you need to check the full list of mount points, use getmntent(3) or its thread-safe GNU extension getmntent_r(3).



If you just want to quickly check whether a given directory has a filesystem mounted on it or not, then use one of the functions in the stat(2) family. For example, if you want to check if /mnt has a filesystem mounted or not, you could do something like this:



#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

struct stat mountpoint;
struct stat parent;

/* Get the stat structure of the directory...*/
if stat("/mnt", &mountpoint) == -1)
perror("failed to stat mountpoint:");
exit(EXIT_FAILURE);


/* ... and its parent. */
if stat("/mnt/..", &parent) == -1)
perror("failed to stat parent:");
exit(EXIT_FAILURE);


/* Compare the st_dev fields in the results: if they are
equal, then both the directory and its parent belong
to the same filesystem, and so the directory is not
currently a mount point.
*/
if (mountpoint.st_dev == parent.st_dev)
printf("No, there is nothing mounted in that directory.n");
else
printf("Yes, there is currently a filesystem mounted.n");







share|improve this answer












share|improve this answer



share|improve this answer










answered Jan 29 at 8:09









telcoMtelcoM

17.6k12347




17.6k12347












  • I would advise against using getmnent() &co. First, they're not able to parse /proc/self/mountinfo (which contains info beyond /etc/mtab), second, there's no guarantee that the info they're returning is up to date, and third the format of the file is simple enough to be parsed with sscanf (the only complication is translating octal sequences eg. 12 for newline in paths, but even that could be easily done in place with 2 lines of C). It's not worth the trouble to deal with the ornery getmntent() interface, ever.

    – mosvy
    Jan 29 at 16:08












  • What else do you suggest to use instead of getmnent()

    – OpenSourceEnthusiast
    Feb 7 at 4:21

















  • I would advise against using getmnent() &co. First, they're not able to parse /proc/self/mountinfo (which contains info beyond /etc/mtab), second, there's no guarantee that the info they're returning is up to date, and third the format of the file is simple enough to be parsed with sscanf (the only complication is translating octal sequences eg. 12 for newline in paths, but even that could be easily done in place with 2 lines of C). It's not worth the trouble to deal with the ornery getmntent() interface, ever.

    – mosvy
    Jan 29 at 16:08












  • What else do you suggest to use instead of getmnent()

    – OpenSourceEnthusiast
    Feb 7 at 4:21
















I would advise against using getmnent() &co. First, they're not able to parse /proc/self/mountinfo (which contains info beyond /etc/mtab), second, there's no guarantee that the info they're returning is up to date, and third the format of the file is simple enough to be parsed with sscanf (the only complication is translating octal sequences eg. 12 for newline in paths, but even that could be easily done in place with 2 lines of C). It's not worth the trouble to deal with the ornery getmntent() interface, ever.

– mosvy
Jan 29 at 16:08






I would advise against using getmnent() &co. First, they're not able to parse /proc/self/mountinfo (which contains info beyond /etc/mtab), second, there's no guarantee that the info they're returning is up to date, and third the format of the file is simple enough to be parsed with sscanf (the only complication is translating octal sequences eg. 12 for newline in paths, but even that could be easily done in place with 2 lines of C). It's not worth the trouble to deal with the ornery getmntent() interface, ever.

– mosvy
Jan 29 at 16:08














What else do you suggest to use instead of getmnent()

– OpenSourceEnthusiast
Feb 7 at 4:21





What else do you suggest to use instead of getmnent()

– OpenSourceEnthusiast
Feb 7 at 4:21

















draft saved

draft discarded
















































Thanks for contributing an answer to Unix & Linux Stack Exchange!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f497351%2fdetect-if-usb-disk-is-mounted-in-c-application-in-linux%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown






Popular posts from this blog

How to check contact read email or not when send email to Individual?

Bahrain

Postfix configuration issue with fips on centos 7; mailgun relay