Back to C Programming
2026-07-125 min read

C - Command Execution

Learn C - Command Execution step by step with clear examples and exercises.

Why This Matters

Understanding command execution in C is crucial for writing versatile programs that can interact with the operating system and perform tasks such as file manipulation, process management, and system calls. By using functions like system() and popen(), you can execute various commands directly from your C code, making it more efficient and flexible.

Prerequisites

Before diving into command execution in C, you should have a good understanding of:

  • C basics (variables, data types, operators, control structures)
  • File I/O in C (reading and writing to files)
  • Basic shell commands (ls, cd, cat, etc.)
  • Understanding the file system structure and navigating directories

Core Concept

system() Function

The system() function is a part of the C Standard Library and allows you to execute any command or program from within your C code. It takes a string containing the command as its argument and returns the exit status of the executed command.

Here's an example of using system() to run the ls command:

#include <stdio.h>
#include <stdlib.h>

int main() {
system("ls"); // Lists the contents of the current directory
return 0;
}

When you compile and run this program, it will list the contents of the current directory.

Common Mistakes

  1. Forgetting to include stdlib.h: Remember to include stdlib.h in your code to use the system() function.
  2. Not passing the command as a string: The argument to system() should be a string, not a variable or expression.
  3. Ignoring the return value: The system() function returns the exit status of the executed command. You can use this information for error handling or other purposes.
  4. Executing commands that require user input: Be aware that some commands may prompt for user input, which cannot be handled directly within the system() function call.

popen() Function

Another way to execute commands in C is by using the popen() function, which creates a pipe between your program and the executed command. It opens a stream for input/output (I/O) and returns a FILE pointer that can be used with standard I/O functions like fgets(), fprintf(), etc.

Here's an example of using popen() to read the output of the ls command:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
FILE *pipe = popen("ls", "r"); // Opens a read-only pipe for the ls command
char buffer[128];
size_t n;

while ((n = fgets(buffer, sizeof(buffer), pipe)) != NULL) {
printf("Read from pipe: %s", buffer);
}

pclose(pipe); // Closes the pipe when done
return 0;
}

In this example, the popen() function opens a read-only pipe for the ls command. The output of the command is then read line by line using fgets() and printed to the console. Finally, the pipe is closed with pclose().

Common Mistakes

  1. Not checking return value: If popen() fails to create the pipe (e.g., due to a syntax error in the command), it returns NULL. You should check for this case and handle errors appropriately.
  2. Not closing the pipe: Remember to call pclose() when you're done with the pipe to release resources.
  3. Reading/writing incorrectly: Be mindful of the I/O mode (read or write) when calling popen(). You can specify it as the second argument ("r" for read, "w" for write).
  4. Executing commands that require user input: Similar to system(), some commands may prompt for user input, which cannot be handled directly within the popen() function call.

Worked Example

In this example, we will create a C program that executes the command ls -l and prints the output to the console using both system() and popen().

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
// Using system()
system("ls -l");

// Using popen()
FILE *pipe = popen("ls -l", "r");
char buffer[128];
size_t n;

while ((n = fgets(buffer, sizeof(buffer), pipe)) != NULL) {
printf("Read from pipe: %s", buffer);
}

pclose(pipe);
return 0;
}

Common Mistakes

  1. Not including the necessary header files (stdlib.h and stdio.h): Remember to include both stdlib.h and stdio.h to use system() and standard I/O functions like printf(), respectively.
  2. Executing commands with syntax errors: Make sure the command you're executing is valid and correctly formatted, as any errors will cause both system() and popen() to fail.
  3. Ignoring return values: Both system() and popen() can return error codes that should be handled appropriately in your code.
  4. Not handling user input prompts: Some commands may prompt for user input, which cannot be handled directly within the system() or popen() function calls. You'll need to handle these cases outside of the function calls if necessary.
  5. Not closing pipes with pclose(): Remember to call pclose() when you're done with the pipe to release resources and avoid memory leaks.
  6. Using system() or popen() for sensitive operations: Be aware that using system() or popen() for sensitive operations like password handling can pose security risks, as they execute commands in the user's environment without proper sandboxing or input validation.

Practice Questions

  1. Write a C program that executes the command ls -l and prints the output to the console using both system() and popen().
  2. Modify the example using popen() to execute the cat command on a specific file (e.g., "example.txt").
  3. Use system() or popen() to create a new directory named "my_directory" in the current working directory.
  4. Write a C program that finds the total number of lines in all .txt files in the current directory using ls, wc, and popen().
  5. (Advanced) Write a C program that uses system() or popen() to execute a command on a remote server via SSH.

FAQ

Q: Why can't I use system("cd /path/to/directory") to change directories?

A: The system() function does not support changing directories directly. Instead, you should use the chdir() function from the C Standard Library.

Q: What happens if an error occurs while executing a command using system() or popen()?

A: If an error occurs during command execution, both functions return -1. You can check for this return value and handle errors appropriately in your code.

Q: Can I use system() or popen() to execute commands on remote servers?

A: Yes, you can use system() or popen() with SSH (Secure Shell) to execute commands on remote servers. However, this requires additional setup and may have security implications. You might want to consider using libraries like libssh for a more secure and feature-rich solution.

Q: How can I handle user input prompts when executing commands with system() or popen()?

A: To handle user input prompts, you'll need to redirect the standard input (stdin) of your command to a file containing the desired input or implement a custom solution using fflush(), fseek(), and fgets() to read and write to the pipe. Keep in mind that handling user input prompts can be complex and may require careful consideration of security implications.