Retrieving command line arguments of a particular PID


Login or Register for Dates, Times and to Reply

 
Thread Tools Search this Thread
# 1  
Retrieving command line arguments of a particular PID

hi

The "ps" command shows the command line arguments of running processes:

$ /bin/ps -o pid,args -e
....
26031 pico /tmp/crontab2KaG1Y
596 /usr/lib/sendmail -bd -q15m
9955 xterm -n 1 -sb -sl 800 -g 80+70+70
2627 /usr/sbin/snmpd -Lsd -Lf /dev/null -p /var/run/snmpd -a 1691
....

I need to write a C program to get the command line arguments of a particular process id, but do not want to rely on:

system("/bin/ps -o pid,args -e");
--or--
popen("/bin/ps -o pid,args -e", "r");

On Solaris, the command line arguments of a running process are stored at: /proc/<pid>/psinfo
On Linux, the command line arguments of a running process are stored at: /proc/<pid>/cmdline

These two files are not text files, so I'm not sure how to read the contents.

Where can I find example C code to read the contents of the "psinfo" and "cmdline" files?

Thanks
--Andrew
# 2  
In Linux, cmdline is to be used as a regular file which splits arguments by nil chars. So, if you have three arguments named 1.foo 2.bar 3.example, then cmdline will have "foo\0bar\0example\0".

Just read cmdline's content and print the arguments by indexing all \0 locations and using pointer arithmetics.

PS: remember that most C string functions stop at '\0' and if you where to have a string like:
Code:
char * foobar = "foo\0bar\0example\0";
printf ("%s\n", foobar); /* this would print foo */
printf ("%s\n", foobar+4); /* this would print bar */
/* pointer arithmetics... */

# 3  
hi,

Thank you for the tip.

I am able to read in the contents of the "cmdline" file into a variable,
but when I try to print out the string, the output shows only characters before
the first null character.

How do I get the other characters after the first null character.
You suggested that i use pointer arithmetic, but how do i'm not sure
how to get the index of the '\0'.

I used strtok(), but it stops processing after the first null.

my code is below.
-------------------------------------------------

% cd /proc/14007
% cat cmdline
emacs--background-colorblack/tmp/abc

---------------------------

% ps -e -o pid,args | grep 14007
14007 emacs --background-color black /tmp/abc

---------------------------------------

% a.out /proc/14007/cmdline
file length is: 0
content is [emacs] <<<<<----- everything after first null character is not shown
strlen: 5
1: emacs
Tokenizing complete


==============================================================
Code:
#include <stdio.h>


main (int argc, char *argv[])
{
  FILE *fp;
  char *tok;
  int x = 1;
                  
  long  lFileLen;               /* Length of file */
  char *contents;                  /* Dynamically allocated buffer (entire file) */

  if (argc < 2) {
     printf("need a filename\n");
     exit(1);
  }

  fp = fopen(argv[1], "r"); /* Open in BINARY mode */
  if (fp == NULL) {
      printf("could not open file\n");
      exit(2);
  }

  fseek(fp, 0L, SEEK_END);  /* Position to end of file */
  lFileLen = ftell(fp);     /* Get file length */
  rewind(fp);               /* Back to start of file */

  printf("file length is: %ld\n", lFileLen);
 
  lFileLen = 200; /* assume there are 200 bytes at most */
  
  contents = (char*)calloc(lFileLen + 1, sizeof(char));

  if(contents == NULL )
  {
    printf("\nInsufficient memory to read file.\n");
    return 0;
  }

  /* Read the entire file into contents */
  fread(contents, lFileLen, 1, fp); 
  
  fclose(fp);

  printf("content is [%s]\n", contents);  /* nothing after first null character !!! */
  printf("strlen: %d\n", strlen(contents)); 
  
   /* extract first string from string sequence */
  tok = (char*)strtok(contents, "\0");

  /* print first string after tokenized */
  printf("%i: %s\n", x, tok);

  /* loop until finishied */
  while (1) 
  { 
          /* extract string from string sequence */
          tok = (char*)strtok(NULL, "\0");

          /* check if there is nothing else to extract */
          if (tok == NULL)
          {
                  printf("Tokenizing complete\n");
               /*   exit(0); */
                  break;
          } 

          /* print string after tokenized */
          printf("/%i: %s\n", x, tok);
          x++;
  } 


  free(contents);

}


Last edited by Andrewkl; 10-29-2008 at 02:40 AM..
Login or Register for Dates, Times and to Reply

Previous Thread | Next Thread
Thread Tools Search this Thread
Search this Thread:
Advanced Search

Test Your Knowledge in Computers #655
Difficulty: Medium
In the mid-1980s Microsoft developed a multitasking version of DOS.
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

command line arguments

hi,,,, I want to create a command prompt, for example "prompt>", so my prompt need to handle commands, for example "prompt>cmd", so i want to know how to get arguments for my own commands cmd, i.e. default argc should contain arguments count and argv should point to the argument vector i.e, for... (2 Replies)
Discussion started by: vins_89
2 Replies

2. UNIX for Dummies Questions & Answers

command line arguments

hi, can someone how to accept command line arguments as a variable using in script? like: ./scriptname arguments by accept arguments, I can use it in my script? thx! (1 Reply)
Discussion started by: ikeQ
1 Replies

3. Shell Programming and Scripting

Maximum command line arguments

Hi, Can anyone please help me to know what is the maximum number of command line arguments that we can pass in unix shell script? Thanks in advance, Punitha.S (2 Replies)
Discussion started by: puni
2 Replies

4. UNIX for Dummies Questions & Answers

getopts - command line arguments

Hi, I'm having problems with a script where I wanted every single option specified in the command line to have an argument taken with it, but for some reason only d works in the code I will be showing below. For example if I did ./thisfile -a something it would come up with "a chosen with " as... (2 Replies)
Discussion started by: IceX
2 Replies

5. UNIX for Dummies Questions & Answers

Command line arguments.

I am working on a script wherein i need the user to enter the Build ID for eg:the command line will show enter the build ID Now on entering the build ID it should be assigned to @ARGV. How can this be done.? (1 Reply)
Discussion started by: Varghese
1 Replies

6. Shell Programming and Scripting

command line arguments

-------------------------------------------------------------------------------- I have this while loop and at the end I am trying to get it to tell me the last argument I entered. And with it like this all I get is the sentence with no value for $1. Now I tried moving done after the sentence... (1 Reply)
Discussion started by: skooly5
1 Replies

7. Shell Programming and Scripting

i want to list all command line arguments except

Hi all i want to list out all command line arguments except $1 i have passed to a script. Ex: sh cmdline.sh one two three four five o/p: two three four five (3 Replies)
Discussion started by: naree
3 Replies

8. UNIX for Dummies Questions & Answers

Retrieving PID from a file

Hello I need to retrieve the content of a file in the shell script file(.sh file). I store the Process ID of the a process in file.Only the PID is available in that file. Inside the shell script i want to retireve the content(PID) and need to check for the existence of the Process.Basically... (5 Replies)
Discussion started by: appleforme1415
5 Replies

9. UNIX for Dummies Questions & Answers

arguments in command line

Hi all, How many arguments can we pass while testing a prgm at command line.. I encountered an issue while passing 10 arguments. For $10 its taking argument passed for $1 followed by 'zero'. can we pass more than 9 arguments /Is there any other way. Thanks, rrs (6 Replies)
Discussion started by: rrs
6 Replies

10. Programming

command line arguments

Hi How to pass multi line text as a command line argument to a program. (i.e) ./a.out hi this is sample 0 file1 where hi this is sample should be stored in argv 0 in argv and so on... (3 Replies)
Discussion started by: bankpro
3 Replies

Featured Tech Videos