- How a linux command uses C system call defined in header files?
- 1. Uname command description
- 2. Trace uname command
- 3. uname system call
- Use of exit() function
- 13 Answers 13
- Output
- PHP: Utilizing exit(); or die(); after header(«Location: «);
- 6 Answers 6
- Why die() or exit():
- Difference:
- Exit() in action
- Die() in action
- Difference
How a linux command uses C system call defined in header files?
In this post, we will check how a linux command executes on the system.
We will learn how a linux command is manipulated by the bash and how it uses the system calls defined in C header files.
For this lets take example of uname command.
1. Uname command description
uname prints information about our software and hardware. A 64-bit machine could be running a 32-bit Linux distribution also.
[root@ngelinux ~]# uname -a Linux ngelinux 2.6.32-696.el6.i686 #1 SMP Tue Mar 21 18:53:30 UTC 2017 i686 i686 i386 GNU/Linux [root@ngelinux ~]#
uname -a prints this information (in order): kernel-name, nodename, kernel-release, kernel-version, machine, processor, hardware-platform, operating-system. If you see 64 bit hardware and i686 kernel, then you have installed a 32-bits Linux kernel.
2. Trace uname command
uname is a system call and we can use starce command to trace the command execution.
The tracing is helpful to understand what all files read by command, however we can’t track what all system calls defined in programming uname.
For this you need to read about linux programming.
[root@ngelinux ~]# strace -v /bin/uname -a execve("/bin/uname", ["/bin/uname", "-a"], ["HOSTNAME=ngelinux", "SELINUX_ROLE_REQUESTED=", "TERM=xterm", "SHELL=/bin/bash", "HISTSIZE=1000", "SSH_CLIENT=192.168.52.1 64654 22", "SELINUX_USE_CURRENT_RANGE=", "SSH_TTY=/dev/pts/1", "USER=root", "LS_COLORS=rs=0:di=01;34:ln=01;36". "LIBGL_DRIVERS_PATH=/usr/lib/dri", "MAIL=/var/spool/mail/root", "PATH=/usr/local/sbin:/usr/local/". "PWD=/root", "LANG=en_US.UTF-8", "SELINUX_LEVEL_REQUESTED=", "SSH_ASKPASS=/usr/libexec/openssh". "HISTCONTROL=ignoredups", "SHLVL=1", "HOME=/root", "LOGNAME=root", "CVS_RSH=ssh", "SSH_CONNECTION=192.168.52.1 6465". "LESSOPEN=||/usr/bin/lesspipe.sh ". "G_BROKEN_FILENAMES=1", "_=/usr/bin/strace"]) = 0 brk(0) = 0x892e000 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77e7000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3,) = 0 mmap2(NULL, 66865, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb77d6000 close(3) = 0 open("/lib/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\200N\215\0004\0\0\0". 512) = 512 fstat64(3, ) = 0 mmap2(0x8be000, 1665484, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x8be000 mmap2(0xa4f000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x191000) = 0xa4f000 mmap2(0xa52000, 10700, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xa52000 close(3) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d5000 set_thread_area( 6, base_addr:0xb77d56c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1>) = 0 access("/etc/sysconfig/32bit_ssse3_memcpy_via_32bit_ssse3_memmove", F_OK) = -1 ENOENT (No such file or directory) mprotect(0xa4f000, 8192, PROT_READ) = 0 mprotect(0x8b6000, 4096, PROT_READ) = 0 munmap(0xb77d6000, 66865) = 0 brk(0) = 0x892e000 brk(0x894f000) = 0x894f000 open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3 fstat64(3, ) = 0 mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb75d5000 close(3) = 0 uname() = 0 fstat64(1, ) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77e6000 uname() = 0 uname() = 0 write(1, "Linux ngelinux 2.6.32-696.el6.i6". 96Linux ngelinux 2.6.32-696.el6.i686 #1 SMP Tue Mar 21 18:53:30 UTC 2017 i686 i686 i386 GNU/Linux ) = 96 close(1) = 0 munmap(0xb77e6000, 4096) = 0 close(2) = 0 exit_group(0) = ? +++ exited with 0 +++ [root@ngelinux ~]#
3. uname system call
We have got below program from web page: https://askubuntu.com/questions/724415/where-is-uname-pulling-information-from and its copyright to specific author and not NGEL.
#include < stdio.h >// Contains printf() command. #include < sys/utsname.h > // It is the library containing the uname system call. int main() < int ret; // stores the return value of uname() struct utsname utsname; // stores the data returned by uname() struct utsname *utsname_ptr = &utsname; // pointer to the struct holding the data returned by uname() ret = uname(utsname_ptr); // calls uname() on utsname_ptr and stores its return value in ret /* prints the fields of utsname */ printf("%s\n", utsname.sysname); printf("%s\n", utsname.nodename); printf("%s\n", utsname.release); printf("%s\n", utsname.version); printf("%s\n", utsname.machine); /* returns the return value of uname() */ return(ret); >
From the above program, it is clear that uname command uses the system calls as defined in utsname.h header file.
Similar to uname command, every command uses C libraries/header files, and the calls defined in them.
Use of exit() function
When I run it, it shows ERROR: call to undefined function exit(). Also, I want to know how I can create an option to close the window in which the program runs? For example, I made a menu-driven program which had several options and one of them was «exit the menu». How can I make this exit the program (i.e. close the window)?
Code format is one thing, but this is written poorly. You don’t want answers that look like this, do you?
I’m no C-Expert nor can I write it without difficulty so I may be wrong about this. but may I suggest that you throw that book away? Using goto in C is like. like. I don’t know. And if you excuse me now, they figured out how to open doors *hides.in.the.kitchen*.
Well, goto still is valid syntax in C. It may be disapproved stylistically , but it is still valid. void main() OTOH is just plain wrong. Just as exit(); is wrong, and omitting #include is wrong.
13 Answers 13
Try using exit(0); instead. The exit function expects an integer parameter. And don’t forget to #include .
The man page says «` The use of EXIT_SUCCESS and EXIT_FAILURE is slightly more portable (to non-UNIX environments) than the use of 0 and some nonzero value like 1 or -1. `»
The exit function is declared in the stdlib header, so you need to have
at the top of your program to be able to use exit .
Note also that exit takes an integer argument, so you can’t call it like exit() , you have to call as exit(0) or exit(42) . 0 usually means your program completed successfully, and nonzero values are used as error codes.
There are also predefined macros EXIT_SUCCESS and EXIT_FAILURE , e.g. exit(EXIT_SUCCESS);
+1 for not only mentioning that exit takes an integer argument, but explaining why it takes an integer argument and that some compilers require the explicit #include
#include int main(void) < /* . */ if (error_occured) < return (EXIT_FAILURE); >/* . */ return (EXIT_SUCCESS); >
exit(int code); is declared in stdlib.h so you need an
Also:
— You have no parameter for the exit() , it requires an int so provide one.
— Burn this book, it uses goto which is (for everyone but linux kernel hackers) bad, very, very, VERY bad.
int main(int argc, char *argv[])
yeah its written in the book that u better sont use goto bt for the sake of completeness of the book m just giving u an example. so the book aint that bad!!
goto is occasionally the right thing to do (and the Linux kernel provides many examples of that, but it’s not the only code that can use it). But OP’s example is clearly not one of those cases, so yes, that book should be burned :).
The exit() function is a type of function with a return type without an argument. It’s defined by the stdlib header file.
You need to use ( exit(0) or exit(EXIT_SUCCESS)) or (exit(non-zero) or exit(EXIT_FAILURE) ) .
The following example shows the usage of the exit() function.
#include #include int main(void)
Output
Start of the program.
Exiting the program.
In addition to return an exit code to parent process —
In UNIX, an important aspect that I think has been left out is, that exit() at first calls (in reverse order) all those functions, which were registered by atexit() call.
Please refer to SUSv4 for details.
You must add a line with #include to include that header file and exit must return a value so assign some integer in exit(any_integer) .
on unix like operating systems exit belongs to group of system calls. system calls are special calls which enable user code (your code) to call kernel code. so exit call makes some OS specific clean-up actions before returning control to OS, it terminates the program.
#include // example 1 int main(int argc, char *argv) < exit(EXIT_SUCCESS); >// example 2 int main(int argc, char *argv)
Some compilers will give you the same opcode from both of these examples but some won’t. For example opcode from first function will not include any kind of stack positioning opcode which will be included in the second example like for any other function. You could compile both examples and disassemble them and you will see the difference.
You can use exit from any part of your code and be sure that process terminates. Don’t forget to include integer parameter.
PHP: Utilizing exit(); or die(); after header(«Location: «);
I recently read a post about exit(); and die(); and had no idea that I was supposed to be using these. From what I understand, they make it end the PHP? Is that correct? What’s the best way I can work toward this, simply adding one of these functions directly after ever header(); execution I have? I have AJAX, jQuery reading through my login.php/register.php, will this be affect in any way? Edit: Other than after header();, where else should I be usitilizing the exit(); or die(); functions? And is exit(); more used around PHP whereas die(); more used around Perl?
My register.php checks if a form was submitted to it, then reads through the inputs, and using AJAX $.post(); it returns any errors found in register.php into the HTML for the user to see.
I tend to use exit when it’s part of a normal script behavior and die when debugging. I have seen others use this convention too. They do the same thing, but the convention is useful.
6 Answers 6
I have been looking for an answer on this as well. What I found:
Why die() or exit():
If you don’t put a die() or exit() after your header(‘Location: http://something’) your script may continue resulting in unexpected behaviour. This may for example result in content being disclosed that you actually wanted to prevent with the redirect (HTTP 301). The aforementioned may not directly be visible for an end user as the browser may not render it (due to the 301). Conclusion, the exit() and die() functions stop the script from continuing.
Difference:
I also wanted to know the difference between the functions as it seems there is none. However, in PHP, there is a distinct difference in Header output. In the examples below I chose to use a different header but for sake of showing the difference between exit() and die() that doesn’t matter.
Exit() in action
HTTP/1.1 304 Not Modified Connection: Keep-Alive Keep-Alive: timeout=5, max=100
Die() in action
HTTP/1.1 304 Not Modified Connection: close
Difference
So, die() closes the connection and exit() doesn’t. It depends on performance whether or not you want to keep the connection open or close it. Both have advantages and disadvantages and depends on your specific requirement(s).