Usage difference between device files, ioctl, sysfs, netlink
I'm trying to clarify which is the most useful (in terms of functionality) method of interacting with devices in Linux. As I understand, device files expose only part of functionality (address blocks in block devices, streams in character devices, etc...). ioctl(2)
seems to be most commonly used, yet some people says it's not safe, and so on.
Some good articles or other relevant pointers would be welcome.
devices sysfs ioctl
add a comment |
I'm trying to clarify which is the most useful (in terms of functionality) method of interacting with devices in Linux. As I understand, device files expose only part of functionality (address blocks in block devices, streams in character devices, etc...). ioctl(2)
seems to be most commonly used, yet some people says it's not safe, and so on.
Some good articles or other relevant pointers would be welcome.
devices sysfs ioctl
add a comment |
I'm trying to clarify which is the most useful (in terms of functionality) method of interacting with devices in Linux. As I understand, device files expose only part of functionality (address blocks in block devices, streams in character devices, etc...). ioctl(2)
seems to be most commonly used, yet some people says it's not safe, and so on.
Some good articles or other relevant pointers would be welcome.
devices sysfs ioctl
I'm trying to clarify which is the most useful (in terms of functionality) method of interacting with devices in Linux. As I understand, device files expose only part of functionality (address blocks in block devices, streams in character devices, etc...). ioctl(2)
seems to be most commonly used, yet some people says it's not safe, and so on.
Some good articles or other relevant pointers would be welcome.
devices sysfs ioctl
devices sysfs ioctl
edited Dec 16 at 9:04
GAD3R
25.4k1750106
25.4k1750106
asked Aug 5 '16 at 12:46
Constantine
18010
18010
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
ioctl
tends to go hand-in-hand with a /dev
entry; your typical code would do
fd=open("/dev/mydevice",O_RDRW);
ioctl(fd,.....);
This is perfectly standard Unix behaviour. Inside the kernel driver you can put access controls (eg only root
can do some things, or require a specific capability for more fine grained access) which makes it pretty flexible and powerful.
Of course this means that devices can expose a lot more than use block/character read-write activity; many things can be done via ioctl
calls. Not so easy to use from shell scripts, but pretty easy from C
or perl
or python
or similar.
sysfs
entries are another way of interacting with drivers. Typically each type of command would have a different entry, so it can be complicated to write the driver but it makes it very easy to access via userspace; simple shell scripts can manipulate lots of stuff, but may not be very efficient
netlink
is primarily focused (I think!) on network data transfers, but it could be used for other stuff. It's really good for larger volumes of data transfer and is meant to be a successor to ioctl
in some cases.
All the options are good; your use case may better determine which type of interface to expose from your driver.
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f301508%2fusage-difference-between-device-files-ioctl-sysfs-netlink%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
ioctl
tends to go hand-in-hand with a /dev
entry; your typical code would do
fd=open("/dev/mydevice",O_RDRW);
ioctl(fd,.....);
This is perfectly standard Unix behaviour. Inside the kernel driver you can put access controls (eg only root
can do some things, or require a specific capability for more fine grained access) which makes it pretty flexible and powerful.
Of course this means that devices can expose a lot more than use block/character read-write activity; many things can be done via ioctl
calls. Not so easy to use from shell scripts, but pretty easy from C
or perl
or python
or similar.
sysfs
entries are another way of interacting with drivers. Typically each type of command would have a different entry, so it can be complicated to write the driver but it makes it very easy to access via userspace; simple shell scripts can manipulate lots of stuff, but may not be very efficient
netlink
is primarily focused (I think!) on network data transfers, but it could be used for other stuff. It's really good for larger volumes of data transfer and is meant to be a successor to ioctl
in some cases.
All the options are good; your use case may better determine which type of interface to expose from your driver.
add a comment |
ioctl
tends to go hand-in-hand with a /dev
entry; your typical code would do
fd=open("/dev/mydevice",O_RDRW);
ioctl(fd,.....);
This is perfectly standard Unix behaviour. Inside the kernel driver you can put access controls (eg only root
can do some things, or require a specific capability for more fine grained access) which makes it pretty flexible and powerful.
Of course this means that devices can expose a lot more than use block/character read-write activity; many things can be done via ioctl
calls. Not so easy to use from shell scripts, but pretty easy from C
or perl
or python
or similar.
sysfs
entries are another way of interacting with drivers. Typically each type of command would have a different entry, so it can be complicated to write the driver but it makes it very easy to access via userspace; simple shell scripts can manipulate lots of stuff, but may not be very efficient
netlink
is primarily focused (I think!) on network data transfers, but it could be used for other stuff. It's really good for larger volumes of data transfer and is meant to be a successor to ioctl
in some cases.
All the options are good; your use case may better determine which type of interface to expose from your driver.
add a comment |
ioctl
tends to go hand-in-hand with a /dev
entry; your typical code would do
fd=open("/dev/mydevice",O_RDRW);
ioctl(fd,.....);
This is perfectly standard Unix behaviour. Inside the kernel driver you can put access controls (eg only root
can do some things, or require a specific capability for more fine grained access) which makes it pretty flexible and powerful.
Of course this means that devices can expose a lot more than use block/character read-write activity; many things can be done via ioctl
calls. Not so easy to use from shell scripts, but pretty easy from C
or perl
or python
or similar.
sysfs
entries are another way of interacting with drivers. Typically each type of command would have a different entry, so it can be complicated to write the driver but it makes it very easy to access via userspace; simple shell scripts can manipulate lots of stuff, but may not be very efficient
netlink
is primarily focused (I think!) on network data transfers, but it could be used for other stuff. It's really good for larger volumes of data transfer and is meant to be a successor to ioctl
in some cases.
All the options are good; your use case may better determine which type of interface to expose from your driver.
ioctl
tends to go hand-in-hand with a /dev
entry; your typical code would do
fd=open("/dev/mydevice",O_RDRW);
ioctl(fd,.....);
This is perfectly standard Unix behaviour. Inside the kernel driver you can put access controls (eg only root
can do some things, or require a specific capability for more fine grained access) which makes it pretty flexible and powerful.
Of course this means that devices can expose a lot more than use block/character read-write activity; many things can be done via ioctl
calls. Not so easy to use from shell scripts, but pretty easy from C
or perl
or python
or similar.
sysfs
entries are another way of interacting with drivers. Typically each type of command would have a different entry, so it can be complicated to write the driver but it makes it very easy to access via userspace; simple shell scripts can manipulate lots of stuff, but may not be very efficient
netlink
is primarily focused (I think!) on network data transfers, but it could be used for other stuff. It's really good for larger volumes of data transfer and is meant to be a successor to ioctl
in some cases.
All the options are good; your use case may better determine which type of interface to expose from your driver.
answered Aug 5 '16 at 14:33
Stephen Harris
24.6k24477
24.6k24477
add a comment |
add a comment |
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.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- 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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f301508%2fusage-difference-between-device-files-ioctl-sysfs-netlink%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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