'Passing argument to system() in C

I want to find the number of context switches of a program. I know there is a file /proc/PID/status which reports the number of context switches continuously while the program is running. However, after the process is finished that file is deleted, so I am not able to check the content.

For this reason, in the following C code, I am trying to copying that file before and after the region of interest.

int pid_num = getpid();
system("sudo cp /proc/$pid_num/status start.txt");
// do
system("sudo cp /proc/$pid_num/status finish.txt");

As I run the program, I get this message

 cp: cannot stat '/proc//status': No such file or directory

It seems that $pid_num in the system function is not correct. What is the correct form then?



Solution 1:[1]

C uses format specifiers equivalent to more generic $var shell counterpart. You need to prepare the command-string before invoking system() call.

#define START_FILE "start.txt"
#define END_FILE "finish.txt"
#define MAX_CMD_BUFFSIZE 256 // adjust as necessary

char cmdbuf[MAX_CMD_BUFFSIZE];

pid_t pid_num = getpid();
snprintf(cmdbuf, sizeof(cmdbuf), "sudo cp -f /proc/%d/status %s", pid_num, START_FILE);
int cmd_status = system(cmdbuf);
// verify 

snprintf(cmdbuf, sizeof(cmdbuf), "sudo cp -f /proc/%d/status %s", pid_num, END_FILE);
cmd_status = system(cmdbuf);
// verify
  • use -f command option to replace target file if it already exists.

  • Also, you need to run this program with an user with sudo privileges; which is inviting trouble. If process status file is available for every user for reading, check if you can drop sudo from command.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1