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 the DM override racial traits?

What is special about square numbers here?

What information about me do stores get via my credit card?

Is it ethical to upload a automatically generated paper to a non peer-reviewed site as part of a larger research?

What are these Gizmos at Izaña Atmospheric Research Center in Spain?

How to copy the contents of all files with a certain name into a new file?

How to test the equality of two Pearson correlation coefficients computed from the same sample?

Segmentation fault output is suppressed when piping stdin into a function. Why?

how can a perfect fourth interval be considered either consonant or dissonant?

Would an alien lifeform be able to achieve space travel if lacking in vision?

Python - Fishing Simulator

Mortgage adviser recommends a longer term than necessary combined with overpayments

Keeping a retro style to sci-fi spaceships?

Change bounding box of math glyphs in LuaTeX

Who or what is the being for whom Being is a question for Heidegger?

How to delete random line from file using Unix command?

What aspect of planet Earth must be changed to prevent the industrial revolution?

What can I do if neighbor is blocking my solar panels intentionally?

Problems with Ubuntu mount /tmp

What do you call a plan that's an alternative plan in case your initial plan fails?

Do working physicists consider Newtonian mechanics to be "falsified"?

What's the point in a preamp?

Can a relay be on for 16 hours continuously?

In horse breeding, what is the female equivalent of putting a horse out "to stud"?



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;








9















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);









share|improve this question



















  • 4





    Start worrying if your string is more than 100 KiB. Until then, you should be OK.

    – Jonathan Leffler
    10 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
    2 hours ago











  • BTW, the system() function is a very different thing from a "system call" in the syscall (userspace/kernelspace boundary) sense of the word.

    – Charles Duffy
    2 hours ago

















9















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);









share|improve this question



















  • 4





    Start worrying if your string is more than 100 KiB. Until then, you should be OK.

    – Jonathan Leffler
    10 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
    2 hours ago











  • BTW, the system() function is a very different thing from a "system call" in the syscall (userspace/kernelspace boundary) sense of the word.

    – Charles Duffy
    2 hours ago













9












9








9








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);









share|improve this question
















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






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 2 hours ago









Charles Duffy

181k28206261




181k28206261










asked 10 hours ago









Cacahuete FritoCacahuete Frito

661620




661620







  • 4





    Start worrying if your string is more than 100 KiB. Until then, you should be OK.

    – Jonathan Leffler
    10 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
    2 hours ago











  • BTW, the system() function is a very different thing from a "system call" in the syscall (userspace/kernelspace boundary) sense of the word.

    – Charles Duffy
    2 hours ago












  • 4





    Start worrying if your string is more than 100 KiB. Until then, you should be OK.

    – Jonathan Leffler
    10 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
    2 hours ago











  • BTW, the system() function is a very different thing from a "system call" in the syscall (userspace/kernelspace boundary) sense of the word.

    – Charles Duffy
    2 hours ago







4




4





Start worrying if your string is more than 100 KiB. Until then, you should be OK.

– Jonathan Leffler
10 hours ago





Start worrying if your string is more than 100 KiB. Until then, you should be OK.

– Jonathan Leffler
10 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
2 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
2 hours ago













BTW, the system() function is a very different thing from a "system call" in the syscall (userspace/kernelspace boundary) sense of the word.

– Charles Duffy
2 hours ago





BTW, the system() function is a very different thing from a "system call" in the syscall (userspace/kernelspace boundary) sense of the word.

– Charles Duffy
2 hours ago












3 Answers
3






active

oldest

votes


















8














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;





share|improve this answer




















  • 1





    Note that this value may be large for allocation with automatic storage.

    – chqrlie
    9 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
    8 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
    2 hours ago











  • @ZanLynx I think that'll only work with a fresh environment. The environment-manipulating functions don't appear to keep the backend contiguous.

    – PSkocik
    58 mins ago











  • @PSkocik Ah yeah, that looks to be true. Hmm.

    – Zan Lynx
    46 mins ago


















4














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.






share|improve this answer
































    3















    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 :)






    share|improve this answer

























      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
      );



      );













      draft saved

      draft discarded


















      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









      8














      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;





      share|improve this answer




















      • 1





        Note that this value may be large for allocation with automatic storage.

        – chqrlie
        9 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
        8 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
        2 hours ago











      • @ZanLynx I think that'll only work with a fresh environment. The environment-manipulating functions don't appear to keep the backend contiguous.

        – PSkocik
        58 mins ago











      • @PSkocik Ah yeah, that looks to be true. Hmm.

        – Zan Lynx
        46 mins ago















      8














      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;





      share|improve this answer




















      • 1





        Note that this value may be large for allocation with automatic storage.

        – chqrlie
        9 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
        8 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
        2 hours ago











      • @ZanLynx I think that'll only work with a fresh environment. The environment-manipulating functions don't appear to keep the backend contiguous.

        – PSkocik
        58 mins ago











      • @PSkocik Ah yeah, that looks to be true. Hmm.

        – Zan Lynx
        46 mins ago













      8












      8








      8







      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;





      share|improve this answer















      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;






      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited 10 hours ago

























      answered 10 hours ago









      PSkocikPSkocik

      35.4k65579




      35.4k65579







      • 1





        Note that this value may be large for allocation with automatic storage.

        – chqrlie
        9 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
        8 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
        2 hours ago











      • @ZanLynx I think that'll only work with a fresh environment. The environment-manipulating functions don't appear to keep the backend contiguous.

        – PSkocik
        58 mins ago











      • @PSkocik Ah yeah, that looks to be true. Hmm.

        – Zan Lynx
        46 mins ago












      • 1





        Note that this value may be large for allocation with automatic storage.

        – chqrlie
        9 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
        8 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
        2 hours ago











      • @ZanLynx I think that'll only work with a fresh environment. The environment-manipulating functions don't appear to keep the backend contiguous.

        – PSkocik
        58 mins ago











      • @PSkocik Ah yeah, that looks to be true. Hmm.

        – Zan Lynx
        46 mins ago







      1




      1





      Note that this value may be large for allocation with automatic storage.

      – chqrlie
      9 hours ago





      Note that this value may be large for allocation with automatic storage.

      – chqrlie
      9 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
      8 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
      8 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
      2 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
      2 hours ago













      @ZanLynx I think that'll only work with a fresh environment. The environment-manipulating functions don't appear to keep the backend contiguous.

      – PSkocik
      58 mins ago





      @ZanLynx I think that'll only work with a fresh environment. The environment-manipulating functions don't appear to keep the backend contiguous.

      – PSkocik
      58 mins ago













      @PSkocik Ah yeah, that looks to be true. Hmm.

      – Zan Lynx
      46 mins ago





      @PSkocik Ah yeah, that looks to be true. Hmm.

      – Zan Lynx
      46 mins ago













      4














      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.






      share|improve this answer





























        4














        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.






        share|improve this answer



























          4












          4








          4







          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.






          share|improve this answer















          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.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 9 hours ago

























          answered 10 hours ago









          chqrliechqrlie

          63.7k851108




          63.7k851108





















              3















              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 :)






              share|improve this answer





























                3















                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 :)






                share|improve this answer



























                  3












                  3








                  3








                  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 :)






                  share|improve this 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 :)







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited 10 hours ago

























                  answered 10 hours ago









                  Rob KieltyRob Kielty

                  6,43153047




                  6,43153047



























                      draft saved

                      draft discarded
















































                      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.




                      draft saved


                      draft discarded














                      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





















































                      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 create a command for the “strange m” symbol in latex? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)How do you make your own symbol when Detexify fails?Writing bold small caps with mathpazo packageplus-minus symbol with parenthesis around the minus signGreek character in Beamer document titleHow to create dashed right arrow over symbol?Currency symbol: Turkish LiraDouble prec as a single symbol?Plus Sign Too Big; How to Call adfbullet?Is there a TeX macro for three-legged pi?How do I get my integral-like symbol to align like the integral?How to selectively substitute a letter with another symbol representing the same letterHow do I generate a less than symbol and vertical bar that are the same height?

                      Българска екзархия Съдържание История | Български екзарси | Вижте също | Външни препратки | Литература | Бележки | НавигацияУстав за управлението на българската екзархия. Цариград, 1870Слово на Ловешкия митрополит Иларион при откриването на Българския народен събор в Цариград на 23. II. 1870 г.Българската правда и гръцката кривда. От С. М. (= Софийски Мелетий). Цариград, 1872Предстоятели на Българската екзархияПодмененият ВеликденИнформационна агенция „Фокус“Димитър Ризов. Българите в техните исторически, етнографически и политически граници (Атлас съдържащ 40 карти). Berlin, Königliche Hoflithographie, Hof-Buch- und -Steindruckerei Wilhelm Greve, 1917Report of the International Commission to Inquire into the Causes and Conduct of the Balkan Wars

                      Category:Tremithousa Media in category "Tremithousa"Navigation menuUpload media34° 49′ 02.7″ N, 32° 26′ 37.32″ EOpenStreetMapGoogle EarthProximityramaReasonatorScholiaStatisticsWikiShootMe