system() function string length limit The 2019 Stack Overflow Developer Survey Results Are In Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern) The Ask Question Wizard is Live! Data science time! April 2019 and salary with experienceHow can I get a file's size in C?How do function pointers in C work?How does free know how much to free?Improve INSERT-per-second performance of SQLite?What does “#define _GNU_SOURCE” imply?Maximum length of command line argument that can be passed to SQL*Plus?Why are elementwise additions much faster in separate loops than in a combined loop?POSIX limits the number of character acceptable as user input to 4096, how to increase it?Does Posix supply format string macros for printf/scanf?Define length-prefixed const wide string in C
Can a 1st-level character have an ability score above 18?
How many people can fit inside Mordenkainen's Magnificent Mansion?
How to politely respond to generic emails requesting a PhD/job in my lab? Without wasting too much time
What are these Gizmos at Izaña Atmospheric Research Center in Spain?
How can I protect witches in combat who wear limited clothing?
Scientific Reports - Significant Figures
What is special about square numbers here?
Do working physicists consider Newtonian mechanics to be "falsified"?
Would an alien lifeform be able to achieve space travel if lacking in vision?
Why did all the guest students take carriages to the Yule Ball?
How did the audience guess the pentatonic scale in Bobby McFerrin's presentation?
The following signatures were invalid: EXPKEYSIG 1397BC53640DB551
Did God make two great lights or did He make the great light two?
Why can't devices on different VLANs, but on the same subnet, communicate?
ELI5: Why do they say that Israel would have been the fourth country to land a spacecraft on the Moon and why do they call it low cost?
What can I do if neighbor is blocking my solar panels intentionally?
In horse breeding, what is the female equivalent of putting a horse out "to stud"?
Are my PIs rude or am I just being too sensitive?
The variadic template constructor of my class cannot modify my class members, why is that so?
Why can't wing-mounted spoilers be used to steepen approaches?
What's the point in a preamp?
Do warforged have souls?
How does this infinite series simplify to an integral?
How to copy the contents of all files with a certain name into a new file?
system() function string length limit
The 2019 Stack Overflow Developer Survey Results Are In
Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)
The Ask Question Wizard is Live!
Data science time! April 2019 and salary with experienceHow can I get a file's size in C?How do function pointers in C work?How does free know how much to free?Improve INSERT-per-second performance of SQLite?What does “#define _GNU_SOURCE” imply?Maximum length of command line argument that can be passed to SQL*Plus?Why are elementwise additions much faster in separate loops than in a combined loop?POSIX limits the number of character acceptable as user input to 4096, how to increase it?Does Posix supply format string macros for printf/scanf?Define length-prefixed const wide string in C
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
How long can be a string passed to system()
?
I know the POSIX minimum is 4096, but I would like to know the actual size I can use. Is there any macro defined in any header for that, similar to FILENAME_MAX
?
char cmd[SOME_MACRO];
...
system(cmd);
c linux posix
|
show 1 more comment
How long can be a string passed to system()
?
I know the POSIX minimum is 4096, but I would like to know the actual size I can use. Is there any macro defined in any header for that, similar to FILENAME_MAX
?
char cmd[SOME_MACRO];
...
system(cmd);
c linux posix
3
Start worrying if your string is more than 100 KiB. Until then, you should be OK.
– Jonathan Leffler
8 hours ago
@JL2210: cannot use that,SIZE_MAX
is not the maximum string length, it is the maximum value for typesize_t
. This value is usually much larger than anything you can define, especially with automatic storage!
– chqrlie
8 hours ago
@JL2210: same thing, cannot really use that for allocation
– chqrlie
8 hours ago
OK. But the maximum length defined in the C library issize_t
(see return value ofstrlen
).
– JL2210
8 hours ago
If this is a problem for your programming, you are better off writing the command arguments into a file and updating the command to read that. Many programs, like the compiler and linker on Windows, can already read arguments from a file. Some Unix programs likexargs
can read a stream of arguments and run one copy of the command template for eachn
arguments.
– Zan Lynx
37 mins ago
|
show 1 more comment
How long can be a string passed to system()
?
I know the POSIX minimum is 4096, but I would like to know the actual size I can use. Is there any macro defined in any header for that, similar to FILENAME_MAX
?
char cmd[SOME_MACRO];
...
system(cmd);
c linux posix
How long can be a string passed to system()
?
I know the POSIX minimum is 4096, but I would like to know the actual size I can use. Is there any macro defined in any header for that, similar to FILENAME_MAX
?
char cmd[SOME_MACRO];
...
system(cmd);
c linux posix
c linux posix
edited 33 mins ago
Charles Duffy
181k28206261
181k28206261
asked 8 hours ago
Cacahuete FritoCacahuete Frito
656620
656620
3
Start worrying if your string is more than 100 KiB. Until then, you should be OK.
– Jonathan Leffler
8 hours ago
@JL2210: cannot use that,SIZE_MAX
is not the maximum string length, it is the maximum value for typesize_t
. This value is usually much larger than anything you can define, especially with automatic storage!
– chqrlie
8 hours ago
@JL2210: same thing, cannot really use that for allocation
– chqrlie
8 hours ago
OK. But the maximum length defined in the C library issize_t
(see return value ofstrlen
).
– JL2210
8 hours ago
If this is a problem for your programming, you are better off writing the command arguments into a file and updating the command to read that. Many programs, like the compiler and linker on Windows, can already read arguments from a file. Some Unix programs likexargs
can read a stream of arguments and run one copy of the command template for eachn
arguments.
– Zan Lynx
37 mins ago
|
show 1 more comment
3
Start worrying if your string is more than 100 KiB. Until then, you should be OK.
– Jonathan Leffler
8 hours ago
@JL2210: cannot use that,SIZE_MAX
is not the maximum string length, it is the maximum value for typesize_t
. This value is usually much larger than anything you can define, especially with automatic storage!
– chqrlie
8 hours ago
@JL2210: same thing, cannot really use that for allocation
– chqrlie
8 hours ago
OK. But the maximum length defined in the C library issize_t
(see return value ofstrlen
).
– JL2210
8 hours ago
If this is a problem for your programming, you are better off writing the command arguments into a file and updating the command to read that. Many programs, like the compiler and linker on Windows, can already read arguments from a file. Some Unix programs likexargs
can read a stream of arguments and run one copy of the command template for eachn
arguments.
– Zan Lynx
37 mins ago
3
3
Start worrying if your string is more than 100 KiB. Until then, you should be OK.
– Jonathan Leffler
8 hours ago
Start worrying if your string is more than 100 KiB. Until then, you should be OK.
– Jonathan Leffler
8 hours ago
@JL2210: cannot use that,
SIZE_MAX
is not the maximum string length, it is the maximum value for type size_t
. This value is usually much larger than anything you can define, especially with automatic storage!– chqrlie
8 hours ago
@JL2210: cannot use that,
SIZE_MAX
is not the maximum string length, it is the maximum value for type size_t
. This value is usually much larger than anything you can define, especially with automatic storage!– chqrlie
8 hours ago
@JL2210: same thing, cannot really use that for allocation
– chqrlie
8 hours ago
@JL2210: same thing, cannot really use that for allocation
– chqrlie
8 hours ago
OK. But the maximum length defined in the C library is
size_t
(see return value of strlen
).– JL2210
8 hours ago
OK. But the maximum length defined in the C library is
size_t
(see return value of strlen
).– JL2210
8 hours ago
If this is a problem for your programming, you are better off writing the command arguments into a file and updating the command to read that. Many programs, like the compiler and linker on Windows, can already read arguments from a file. Some Unix programs like
xargs
can read a stream of arguments and run one copy of the command template for each n
arguments.– Zan Lynx
37 mins ago
If this is a problem for your programming, you are better off writing the command arguments into a file and updating the command to read that. Many programs, like the compiler and linker on Windows, can already read arguments from a file. Some Unix programs like
xargs
can read a stream of arguments and run one copy of the command template for each n
arguments.– Zan Lynx
37 mins ago
|
show 1 more comment
3 Answers
3
active
oldest
votes
system
exec's a shell with arguments "sh","-c", YourAgumentToSystem, (char*)0
(guaranteed by POSIX), so
the maximum length (not counting the ''
terminator) is ARG_MAX -1 -3 -3 - size_of_your_environment
.
ARG_MAX
is defined in limits.h as
"Maximum length of argument to the exec functions including
environment data."
To measure the size of your environment, you can run:
extern char **environ;
size_t envsz = 0; for(char **e=environ; *e; e++) envsz += strlen(*e)+1;
1
Note that this value may be large for allocation with automatic storage.
– chqrlie
7 hours ago
1
Its also not guarenteed that exceeding it will fail -- its (just) undefined behavior, so it may work one time you call it and fail the next.
– Chris Dodd
6 hours ago
I don't think that's the most efficient way to calculate environment size. I believe you can run the pointers up until the NULL and subtract from environ, without involvingstrlen
calls.
– Zan Lynx
35 mins ago
add a comment |
The limit is highly system dependent. It may even depend on the command shell that will be used. You should test the return value of system()
to see if the system call was successful: -1
means failure and errno
should give you more information. The behavior should be defined for any proper C string.
POSIX documents that system(command)
is equivalent to:
execl(<shell path>, "sh", "-c", command, (char *)0);
And also documents ARG_MAX
defined in <limits.h>
as the limit for the combined lengths of the arguments to exec
and the environment variables.
Note however that command
may contain wildcards and/or other shell words whose expansion may exceed some other limit. Always check the return value for failure.
1
@CacahueteFrito: not that I know. also bear in mind not to allocate too much data with automatic storage. 2MB is already in the risky zone.
– chqrlie
8 hours ago
3
@CacahueteFrito: I was wrong, there is a documented limit:ARG_MAX
defined in<limits.h>
.
– chqrlie
8 hours ago
add a comment |
man 3 system
gives us
DESCRIPTION
The system() library function uses fork(2) to create a child process that executes the shell command specified in command
using execl(3) as follows:execl("/bin/sh", "sh", "-c", command, (char *) 0);
system() returns after the command has been completed.
so system() is a wrapper for
execl()
From the same page we also see that this call conforms to some standards.
CONFORMING TO
POSIX.1-2001, POSIX.1-2008, C89, C99.
Looking up POSIX.1-2008 produces the following online reference
https://pubs.opengroup.org/onlinepubs/9699919799/
Where we can search for info on the execl
function which system takes us to
https://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html
Which offers up the following
The number of bytes available for the new process' combined argument and environment lists is ARG_MAX. It is implementation-defined whether null terminators, pointers, and/or any alignment bytes are included in this total.
And finally ...
ERRORS
The exec functions shall fail if:
[E2BIG] The number of bytes used by the new process image's argument
list and environment list is greater than the system-imposed limit of
ARG_MAX bytes.
So the final check to carry out here is the actual exec implementation rather than relying on the standard just in case the implementation deviated from the standard.
So, man 3 execl
reports that the errors returned are the same as documented for execve(2)
and man 2 execvw
reports the following:
ERRORS
E2BIG The total number of bytes in the environment (envp) and argument list (argv) is too large.
Not as precise as the POSIX standard? Best check the code or see the (now) accepted answer :)
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
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: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
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%2fstackoverflow.com%2fquestions%2f55666911%2fsystem-function-string-length-limit%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
system
exec's a shell with arguments "sh","-c", YourAgumentToSystem, (char*)0
(guaranteed by POSIX), so
the maximum length (not counting the ''
terminator) is ARG_MAX -1 -3 -3 - size_of_your_environment
.
ARG_MAX
is defined in limits.h as
"Maximum length of argument to the exec functions including
environment data."
To measure the size of your environment, you can run:
extern char **environ;
size_t envsz = 0; for(char **e=environ; *e; e++) envsz += strlen(*e)+1;
1
Note that this value may be large for allocation with automatic storage.
– chqrlie
7 hours ago
1
Its also not guarenteed that exceeding it will fail -- its (just) undefined behavior, so it may work one time you call it and fail the next.
– Chris Dodd
6 hours ago
I don't think that's the most efficient way to calculate environment size. I believe you can run the pointers up until the NULL and subtract from environ, without involvingstrlen
calls.
– Zan Lynx
35 mins ago
add a comment |
system
exec's a shell with arguments "sh","-c", YourAgumentToSystem, (char*)0
(guaranteed by POSIX), so
the maximum length (not counting the ''
terminator) is ARG_MAX -1 -3 -3 - size_of_your_environment
.
ARG_MAX
is defined in limits.h as
"Maximum length of argument to the exec functions including
environment data."
To measure the size of your environment, you can run:
extern char **environ;
size_t envsz = 0; for(char **e=environ; *e; e++) envsz += strlen(*e)+1;
1
Note that this value may be large for allocation with automatic storage.
– chqrlie
7 hours ago
1
Its also not guarenteed that exceeding it will fail -- its (just) undefined behavior, so it may work one time you call it and fail the next.
– Chris Dodd
6 hours ago
I don't think that's the most efficient way to calculate environment size. I believe you can run the pointers up until the NULL and subtract from environ, without involvingstrlen
calls.
– Zan Lynx
35 mins ago
add a comment |
system
exec's a shell with arguments "sh","-c", YourAgumentToSystem, (char*)0
(guaranteed by POSIX), so
the maximum length (not counting the ''
terminator) is ARG_MAX -1 -3 -3 - size_of_your_environment
.
ARG_MAX
is defined in limits.h as
"Maximum length of argument to the exec functions including
environment data."
To measure the size of your environment, you can run:
extern char **environ;
size_t envsz = 0; for(char **e=environ; *e; e++) envsz += strlen(*e)+1;
system
exec's a shell with arguments "sh","-c", YourAgumentToSystem, (char*)0
(guaranteed by POSIX), so
the maximum length (not counting the ''
terminator) is ARG_MAX -1 -3 -3 - size_of_your_environment
.
ARG_MAX
is defined in limits.h as
"Maximum length of argument to the exec functions including
environment data."
To measure the size of your environment, you can run:
extern char **environ;
size_t envsz = 0; for(char **e=environ; *e; e++) envsz += strlen(*e)+1;
edited 8 hours ago
answered 8 hours ago
PSkocikPSkocik
35.4k65579
35.4k65579
1
Note that this value may be large for allocation with automatic storage.
– chqrlie
7 hours ago
1
Its also not guarenteed that exceeding it will fail -- its (just) undefined behavior, so it may work one time you call it and fail the next.
– Chris Dodd
6 hours ago
I don't think that's the most efficient way to calculate environment size. I believe you can run the pointers up until the NULL and subtract from environ, without involvingstrlen
calls.
– Zan Lynx
35 mins ago
add a comment |
1
Note that this value may be large for allocation with automatic storage.
– chqrlie
7 hours ago
1
Its also not guarenteed that exceeding it will fail -- its (just) undefined behavior, so it may work one time you call it and fail the next.
– Chris Dodd
6 hours ago
I don't think that's the most efficient way to calculate environment size. I believe you can run the pointers up until the NULL and subtract from environ, without involvingstrlen
calls.
– Zan Lynx
35 mins ago
1
1
Note that this value may be large for allocation with automatic storage.
– chqrlie
7 hours ago
Note that this value may be large for allocation with automatic storage.
– chqrlie
7 hours ago
1
1
Its also not guarenteed that exceeding it will fail -- its (just) undefined behavior, so it may work one time you call it and fail the next.
– Chris Dodd
6 hours ago
Its also not guarenteed that exceeding it will fail -- its (just) undefined behavior, so it may work one time you call it and fail the next.
– Chris Dodd
6 hours ago
I don't think that's the most efficient way to calculate environment size. I believe you can run the pointers up until the NULL and subtract from environ, without involving
strlen
calls.– Zan Lynx
35 mins ago
I don't think that's the most efficient way to calculate environment size. I believe you can run the pointers up until the NULL and subtract from environ, without involving
strlen
calls.– Zan Lynx
35 mins ago
add a comment |
The limit is highly system dependent. It may even depend on the command shell that will be used. You should test the return value of system()
to see if the system call was successful: -1
means failure and errno
should give you more information. The behavior should be defined for any proper C string.
POSIX documents that system(command)
is equivalent to:
execl(<shell path>, "sh", "-c", command, (char *)0);
And also documents ARG_MAX
defined in <limits.h>
as the limit for the combined lengths of the arguments to exec
and the environment variables.
Note however that command
may contain wildcards and/or other shell words whose expansion may exceed some other limit. Always check the return value for failure.
1
@CacahueteFrito: not that I know. also bear in mind not to allocate too much data with automatic storage. 2MB is already in the risky zone.
– chqrlie
8 hours ago
3
@CacahueteFrito: I was wrong, there is a documented limit:ARG_MAX
defined in<limits.h>
.
– chqrlie
8 hours ago
add a comment |
The limit is highly system dependent. It may even depend on the command shell that will be used. You should test the return value of system()
to see if the system call was successful: -1
means failure and errno
should give you more information. The behavior should be defined for any proper C string.
POSIX documents that system(command)
is equivalent to:
execl(<shell path>, "sh", "-c", command, (char *)0);
And also documents ARG_MAX
defined in <limits.h>
as the limit for the combined lengths of the arguments to exec
and the environment variables.
Note however that command
may contain wildcards and/or other shell words whose expansion may exceed some other limit. Always check the return value for failure.
1
@CacahueteFrito: not that I know. also bear in mind not to allocate too much data with automatic storage. 2MB is already in the risky zone.
– chqrlie
8 hours ago
3
@CacahueteFrito: I was wrong, there is a documented limit:ARG_MAX
defined in<limits.h>
.
– chqrlie
8 hours ago
add a comment |
The limit is highly system dependent. It may even depend on the command shell that will be used. You should test the return value of system()
to see if the system call was successful: -1
means failure and errno
should give you more information. The behavior should be defined for any proper C string.
POSIX documents that system(command)
is equivalent to:
execl(<shell path>, "sh", "-c", command, (char *)0);
And also documents ARG_MAX
defined in <limits.h>
as the limit for the combined lengths of the arguments to exec
and the environment variables.
Note however that command
may contain wildcards and/or other shell words whose expansion may exceed some other limit. Always check the return value for failure.
The limit is highly system dependent. It may even depend on the command shell that will be used. You should test the return value of system()
to see if the system call was successful: -1
means failure and errno
should give you more information. The behavior should be defined for any proper C string.
POSIX documents that system(command)
is equivalent to:
execl(<shell path>, "sh", "-c", command, (char *)0);
And also documents ARG_MAX
defined in <limits.h>
as the limit for the combined lengths of the arguments to exec
and the environment variables.
Note however that command
may contain wildcards and/or other shell words whose expansion may exceed some other limit. Always check the return value for failure.
edited 7 hours ago
answered 8 hours ago
chqrliechqrlie
63.7k851108
63.7k851108
1
@CacahueteFrito: not that I know. also bear in mind not to allocate too much data with automatic storage. 2MB is already in the risky zone.
– chqrlie
8 hours ago
3
@CacahueteFrito: I was wrong, there is a documented limit:ARG_MAX
defined in<limits.h>
.
– chqrlie
8 hours ago
add a comment |
1
@CacahueteFrito: not that I know. also bear in mind not to allocate too much data with automatic storage. 2MB is already in the risky zone.
– chqrlie
8 hours ago
3
@CacahueteFrito: I was wrong, there is a documented limit:ARG_MAX
defined in<limits.h>
.
– chqrlie
8 hours ago
1
1
@CacahueteFrito: not that I know. also bear in mind not to allocate too much data with automatic storage. 2MB is already in the risky zone.
– chqrlie
8 hours ago
@CacahueteFrito: not that I know. also bear in mind not to allocate too much data with automatic storage. 2MB is already in the risky zone.
– chqrlie
8 hours ago
3
3
@CacahueteFrito: I was wrong, there is a documented limit:
ARG_MAX
defined in <limits.h>
.– chqrlie
8 hours ago
@CacahueteFrito: I was wrong, there is a documented limit:
ARG_MAX
defined in <limits.h>
.– chqrlie
8 hours ago
add a comment |
man 3 system
gives us
DESCRIPTION
The system() library function uses fork(2) to create a child process that executes the shell command specified in command
using execl(3) as follows:execl("/bin/sh", "sh", "-c", command, (char *) 0);
system() returns after the command has been completed.
so system() is a wrapper for
execl()
From the same page we also see that this call conforms to some standards.
CONFORMING TO
POSIX.1-2001, POSIX.1-2008, C89, C99.
Looking up POSIX.1-2008 produces the following online reference
https://pubs.opengroup.org/onlinepubs/9699919799/
Where we can search for info on the execl
function which system takes us to
https://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html
Which offers up the following
The number of bytes available for the new process' combined argument and environment lists is ARG_MAX. It is implementation-defined whether null terminators, pointers, and/or any alignment bytes are included in this total.
And finally ...
ERRORS
The exec functions shall fail if:
[E2BIG] The number of bytes used by the new process image's argument
list and environment list is greater than the system-imposed limit of
ARG_MAX bytes.
So the final check to carry out here is the actual exec implementation rather than relying on the standard just in case the implementation deviated from the standard.
So, man 3 execl
reports that the errors returned are the same as documented for execve(2)
and man 2 execvw
reports the following:
ERRORS
E2BIG The total number of bytes in the environment (envp) and argument list (argv) is too large.
Not as precise as the POSIX standard? Best check the code or see the (now) accepted answer :)
add a comment |
man 3 system
gives us
DESCRIPTION
The system() library function uses fork(2) to create a child process that executes the shell command specified in command
using execl(3) as follows:execl("/bin/sh", "sh", "-c", command, (char *) 0);
system() returns after the command has been completed.
so system() is a wrapper for
execl()
From the same page we also see that this call conforms to some standards.
CONFORMING TO
POSIX.1-2001, POSIX.1-2008, C89, C99.
Looking up POSIX.1-2008 produces the following online reference
https://pubs.opengroup.org/onlinepubs/9699919799/
Where we can search for info on the execl
function which system takes us to
https://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html
Which offers up the following
The number of bytes available for the new process' combined argument and environment lists is ARG_MAX. It is implementation-defined whether null terminators, pointers, and/or any alignment bytes are included in this total.
And finally ...
ERRORS
The exec functions shall fail if:
[E2BIG] The number of bytes used by the new process image's argument
list and environment list is greater than the system-imposed limit of
ARG_MAX bytes.
So the final check to carry out here is the actual exec implementation rather than relying on the standard just in case the implementation deviated from the standard.
So, man 3 execl
reports that the errors returned are the same as documented for execve(2)
and man 2 execvw
reports the following:
ERRORS
E2BIG The total number of bytes in the environment (envp) and argument list (argv) is too large.
Not as precise as the POSIX standard? Best check the code or see the (now) accepted answer :)
add a comment |
man 3 system
gives us
DESCRIPTION
The system() library function uses fork(2) to create a child process that executes the shell command specified in command
using execl(3) as follows:execl("/bin/sh", "sh", "-c", command, (char *) 0);
system() returns after the command has been completed.
so system() is a wrapper for
execl()
From the same page we also see that this call conforms to some standards.
CONFORMING TO
POSIX.1-2001, POSIX.1-2008, C89, C99.
Looking up POSIX.1-2008 produces the following online reference
https://pubs.opengroup.org/onlinepubs/9699919799/
Where we can search for info on the execl
function which system takes us to
https://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html
Which offers up the following
The number of bytes available for the new process' combined argument and environment lists is ARG_MAX. It is implementation-defined whether null terminators, pointers, and/or any alignment bytes are included in this total.
And finally ...
ERRORS
The exec functions shall fail if:
[E2BIG] The number of bytes used by the new process image's argument
list and environment list is greater than the system-imposed limit of
ARG_MAX bytes.
So the final check to carry out here is the actual exec implementation rather than relying on the standard just in case the implementation deviated from the standard.
So, man 3 execl
reports that the errors returned are the same as documented for execve(2)
and man 2 execvw
reports the following:
ERRORS
E2BIG The total number of bytes in the environment (envp) and argument list (argv) is too large.
Not as precise as the POSIX standard? Best check the code or see the (now) accepted answer :)
man 3 system
gives us
DESCRIPTION
The system() library function uses fork(2) to create a child process that executes the shell command specified in command
using execl(3) as follows:execl("/bin/sh", "sh", "-c", command, (char *) 0);
system() returns after the command has been completed.
so system() is a wrapper for
execl()
From the same page we also see that this call conforms to some standards.
CONFORMING TO
POSIX.1-2001, POSIX.1-2008, C89, C99.
Looking up POSIX.1-2008 produces the following online reference
https://pubs.opengroup.org/onlinepubs/9699919799/
Where we can search for info on the execl
function which system takes us to
https://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html
Which offers up the following
The number of bytes available for the new process' combined argument and environment lists is ARG_MAX. It is implementation-defined whether null terminators, pointers, and/or any alignment bytes are included in this total.
And finally ...
ERRORS
The exec functions shall fail if:
[E2BIG] The number of bytes used by the new process image's argument
list and environment list is greater than the system-imposed limit of
ARG_MAX bytes.
So the final check to carry out here is the actual exec implementation rather than relying on the standard just in case the implementation deviated from the standard.
So, man 3 execl
reports that the errors returned are the same as documented for execve(2)
and man 2 execvw
reports the following:
ERRORS
E2BIG The total number of bytes in the environment (envp) and argument list (argv) is too large.
Not as precise as the POSIX standard? Best check the code or see the (now) accepted answer :)
edited 8 hours ago
answered 8 hours ago
Rob KieltyRob Kielty
6,43153047
6,43153047
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- 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%2fstackoverflow.com%2fquestions%2f55666911%2fsystem-function-string-length-limit%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
3
Start worrying if your string is more than 100 KiB. Until then, you should be OK.
– Jonathan Leffler
8 hours ago
@JL2210: cannot use that,
SIZE_MAX
is not the maximum string length, it is the maximum value for typesize_t
. This value is usually much larger than anything you can define, especially with automatic storage!– chqrlie
8 hours ago
@JL2210: same thing, cannot really use that for allocation
– chqrlie
8 hours ago
OK. But the maximum length defined in the C library is
size_t
(see return value ofstrlen
).– JL2210
8 hours ago
If this is a problem for your programming, you are better off writing the command arguments into a file and updating the command to read that. Many programs, like the compiler and linker on Windows, can already read arguments from a file. Some Unix programs like
xargs
can read a stream of arguments and run one copy of the command template for eachn
arguments.– Zan Lynx
37 mins ago