Skip to main content

Stack Size : behind the code

How to know the stack size of a process in Linux?
#Interview Question

The stack word is very popular when it comes to C programming. It often intrigues us that how much is the stack size of a process and how to know it.
The answer to this question can not be given without considering the "platform independent" thing. Well, we all are familiar with the word "platform independent". It is only word which comes to our mind when we don't know the answer. :P
So, the stack size depends on the platform, the architecture - microprocessor is of how many bits - 16, 32, 64? But I will explain the answer with respect to Linux operating system.

Method 1
The simplest method which I found is through
cat /proc/-pid-/limits
  • cat command is used to access a file.
  • proc is a directory which contains information about all the running processes.
  • -pid- is the process id of the process. We can know the process id of any process using ps -ef command. See man page of ps for more.
E.g:
I wrote a simple C program. And I put an infinite loop in that program(using while( )) so that it will be running. Then I used ps -ef to find out the -pid- of the process. I found it to be 3274. Then I did the following:
gene@user-laptop:~$ cat /proc/3274/limits
Limit                 Soft Limit     Hard Limit         Units  
Max cpu time          unlimited      unlimited          seconds
Max file size         unlimited      unlimited          bytes  
Max data size         unlimited      unlimited          bytes  
Max stack size        8388608        unlimited          bytes
Max core file size    0              unlimited          bytes  
Max resident set      unlimited      unlimited          bytes  
Max processes         32084          32084              processes
Max open files        1024           4096               files  
Max locked memory     65536          65536              bytes  
Max address space     unlimited      unlimited          bytes  
Max file locks        unlimited      unlimited          locks  
Max pending signals   32084          32084              signals
Max msgqueue size     819200         819200             bytes  
Max nice priority     0              0                 
Max realtime priority 0              0                 
Max realtime timeout  unlimited      unlimited          us 
Check out the line which is marked- Max stack size.
It is 8388608 bytes = 8 MB.

Method 2
There is also a different method to find out the stack size programmatically :
We can find out the stack size using getrlimit( ) system call.
Read about it :
gene@user-laptop:~ man getrlimit
Below is a program to find out the stack size of a process:
After running this program, we will get this output (Linux):
gene@user-laptop:~ gcc -ostacksize stacksize.c
gene@user-laptop:~ ./stacksize
Lower limit = 8388608
Upper limit = 4294967296
These results are in bytes. So, the stack size is 8388608 bytes = 8 MB for a 32 bit processor. The upper limit is the maximum limit upto which size of the stack can be incremented. It is 4294967296 bytes = 4 GB(size of virtual memory space assigned to a process). Though it is 4GB, incrementing it to this limit may overwrite certain other important data.
There is also a system call prlimit which is used to find out the stack size of any arbitrary process. I am leaving that for you to try. Tell me if you face any problem.
I have kept this explanation very compact because it can be found in man page of getrlimit. Still if anyone want more explanation here, just comment below.
-----
Feel free to give suggestions. :)

Comments

Popular posts from this blog

error: invalid application of ‘sizeof’ to incomplete type ‘struct ’

list.c:47:39: error: invalid application of ‘sizeof’ to incomplete type ‘struct Litsnode’ So, I was trying to run a program based on linked list and this is what I got. This is a very silly problem. I am mentioning it here just to help those who got frustrated like me :-\ Let me show you the line where this error occurred : 46   struct Listnode * newnode; 47   newnode = (struct Listnode *) malloc(sizeof(struct Litsnode)); Now, View it properly. Check the name(spelling) of the structure mentioned to sizeof : " struct Li ts node ". Though the defined name of the structure was : " struct Listnode " That's it.  This happens all the time that we may type something wrong. The important thing is to identify it. :-) Feel free to give any suggestions :)

Expandable Arrays in C : behind the code

Arrays. They are beautiful. In C, we always try to work through restrictions arrays have i.e the size of the array must be statically defined. We always want a dynamic array whose size can be decided at run-time. There are ways which we use widely for e.g by using pointers and then dynamically allocating memory to it using malloc or calloc. But depending on the situation, we might require more efficient and organizable ways. I will explain the concept with a series of examples as in how simple arrays evolved to the tricky expandable ones. The classic way is to use pointers This snippet will allocate a memory block of size = array_size(integer array). Though this is not what I wanted to explain because this way is too clumsy. Imagine if you need 10 dynamic arrays in your program, you have to write these four lines each time and you have to keep track of all the 10 sizes. A better way is to use structures: We can simply create a structure containing two elements: array_size and...

ssh: Could not resolve hostname git: No address associated with hostname

I came across this error when I needed to clone a git repo. I tried few times but I couldn't get it working. There were few suggestions on the internet, but none resolved my issue. So, lets get to the point, this issue may occur due to following reasons: 1. If you are using proxy to access git and it is not properly configured/proxy is not allowing you access git due to permission issues. More here: git-clone-no-address-associated-with-name getting-git-to-work-with-a-proxy-server 2. This happens due to a silly mistake. [I do make silly mistakes sometimes] Are you actually using git clone for cloning? I used this - ssh git@github.com:neovim/neovim.git instead of git clone git@github.com:neovim/neovim.git ----- Hope this have resolved your issue :-) Happy Coding.