LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (https://www.linuxquestions.org/questions/programming-9/)
-   -   Getting pid of a process!! (https://www.linuxquestions.org/questions/programming-9/getting-pid-of-a-process-360124/)

vishamr2000 09-04-2005 12:47 PM

Getting pid of a process!!
 
Hi to all,

I would like to know if there's a way to get the pid of a process by using it's name. Also, how can I know of the processes that are running and their pids?

Warm regards,
Visham

UnderDark 09-04-2005 12:53 PM

Code:

ps ax | grep [process name]
will search running running programs for the [process name].

the first number on the left is the pid

Slackwise 09-04-2005 04:09 PM

On Slackware, there is a /sbin/pidof which returns the pid of a program.

vishamr2000 09-05-2005 01:01 AM

Hi,

many thx for the reply...

But what command do I use for getting the pid of a process, which i know by name, in a C program?

Warm regards,
Visham

jlliagre 09-05-2005 01:38 AM

Here's one way, a rewriting of Solaris pgrep/pkill commands to Linux:
http://cvs.sourceforge.net/viewcvs.p...19&view=markup

vishamr2000 09-05-2005 08:18 AM

Hi,

I found sth called pidof...it's a shell script command that returns the pid of a process when you know its name.

So in order to use it this command in a C program, we can use the system command:

void main()
{
...
system("pidof -s name_of_process");
...
}

Thx to all for ur input..

Warm regards,
Visham

jlliagre 09-05-2005 09:10 AM

Calling a shell script from a C program instead of using the C APIs defeats some or all of the interest of writing a C program vs a shell script.

Also, if you still want to use pidof instead of what I sent you (pgrep C source code), you'd rather use popen() instead of system() to get pidof output.

vishamr2000 09-06-2005 05:20 AM

Hi,

I did look at the pgrep.c file...but i'm araid i don't know hw to include it in my code..i'm actualy modifying iptables kernel code, where I need to find the pid of another process. I found it easier to write just one line in the existing code rather than having to paste the source code of pgrep.c. i'm using RH9 by the way.

Can you suggest me a way of how to use prep.c while causing minimal intrusion in the existing iptables kernel code? I can't use makefiles..

Warm regards,
Visham

vishamr2000 09-06-2005 05:25 AM

Hi,

I did look at the pgrep.c file...but i'm araid i don't know hw to include it in my code..i'm actualy modifying iptables kernel code, where I need to find the pid of another process. I found it easier to write just one line in the existing code rather than having to paste the source code of pgrep.c. i'm using RH9 by the way.

Can you suggest me a way of how to use prep.c while causing minimal intrusion in the existing iptables kernel code? I can't use makefiles..


Also, can you tell me why you suggest the use of popen(). CAn you give me an example of how to use it?

Warm regards,
Visham

jlliagre 09-06-2005 09:21 AM

Are you really wanting to call a shell script from kernel code ???

This is close to impossible, and reusing pgrep code in such a situation is at least challenging here too.

Kernel code cannot make use of system calls or libc, although part of libc can be implemented in the kernel itself.

bigearsbilly 09-06-2005 09:47 AM

open-heart surgery using a chainsaw
;)

Pratik H Pandya 09-06-2005 12:17 PM

use getpidbyname()
 
Hi
i'm also new to linux but if you are using c and want to know pid of a process then you can use system call getpidbyname().

jlliagre 09-06-2005 02:53 PM

I doubt any operating system provides a "getpidbyname()" system call.

vishamr2000 09-07-2005 04:22 AM

Hi to all,

I'm trying to call a .c program (Prog1.c) from another .c program (Prog2.c). Prog1.c is actually part of the iptables kernel code. I'm only modifying the file. I'll need to recompile the kernel. Prog2.c is a userspace program that i will write entirely. Prog1.c will send a signal to Prog2.c every time a packet passes through the code of Prog1.c. But in order to send the signal to Prog2.c, Prog1.c needs to know the pid of Prog2.c and then send it.

Do you think it' the best way to do so...

Warm regards,
Visham

jlliagre 09-07-2005 06:11 AM

Quote:

Prog1.c will send a signal to Prog2.c every time a packet passes through the code of Prog1.c.
How do you plan to send a signal to Prog2 from kernel code ?

Hint: http://www.kernelnewbies.org/faq/index.php3#library

vishamr2000 09-07-2005 11:36 AM

Hi to all,

No i don't want a two way communication between Prog1.c and Prog2.c. Prog1.c just sends the signal and it continues it's execution in parallel, without having to wait for Prog2.c to finish. Prog1.c kind of sends the signal and forgets about it.

One thing though..is it possible to send a signal from Prog1.c and not have Prog1.c waits for the return. Can we have a signal that does not return to the program that generated and sent it? I want to do sth like this: Prog1.c issues the signal and then continues with the remaining statements. Is this possible? How can I do that?

Any input will be very much appreciated..

Warm regards,
Visham

jlliagre 09-07-2005 11:43 AM

You want a communication (kill) from the kernel (Prog1) to a userland process (Prog2).

You want too the kernel (Prog1) to call a userland process (pidof) to retrieve a process ID.

You have to think carefully on how you want to achieve both of these tasks, as you are on your own when writing kernel code, no libraries, no (g)libc are available and no bugs are allowed ...

vishamr2000 09-07-2005 04:44 PM

Absolutely correct..for the signal from kernel to Prog2.c, i'll use kill() in the kernel code and sigaction in Prog2.c to catch it.

For the retrieval of the pid of Prog2.c by the kernel program, i can use global variables to store the value of getpid() in Prog2.c and then access it from kernel code.

One question though..how come you have no libraries, no (g)libc are available when doing kernel coding? Then how are we supposed to write programs? I didn't know abt this issue and would be grateful if you could enlighten me on this. Also if you have good sources of info on this and kernel coding, do let me have them.

Warm regards,
Visham

jlliagre 09-07-2005 05:34 PM

Quote:

i'll use kill() in the kernel code
Hmm, I already wrote a couple of times, but let me do it once again:

You are not going to call kill() from the kernel, because you have no access to libraries and system calls
Quote:

For the retrieval of the pid of Prog2.c by the kernel program, i can use global variables to store the value of getpid() in Prog2.c and then access it from kernel code.
Well, this is even harder, how will the kernel access these "global variables" ?
A global variable is global to all functions of a process, but not between processes, and even less between a userland process and the kernel.
Quote:

One question though..how come you have no libraries, no (g)libc are available when doing kernel coding?
Kind of chicken and egg problem, the kernel need to embed everything it needs and not rely on services provided by ... the kernel.
Quote:

Then how are we supposed to write programs?
Programs and kernel code/modules are different beasts.
Quote:

Also if you have good sources of info on this and kernel coding, do let me have them.
I already post a link to a site you seem to have overlooked.

vishamr2000 09-08-2005 09:30 AM

Hi,

>You are not going to call kill() from the kernel, because you have no access to libraries and system calls

I intend to add a few lines of code to a function in iptables (kernel code). Do you mean to say that I will not be able to use the kill() function there? If no, what do you suggest me to do about what I want?

>Well, this is even harder, how will the kernel access these "global variables" ? A global variable is global to all functions of a process, but not between processes, and even less between a userland process and the kernel.

Some one told me that we can declare global variable in /etc/profiles. Variables defined there can be accessed from anywhere - both kernel space and userspace code. To read/ write to that variable, i will have to employ semaphores i believe.

>I already post a link to a site you seem to have overlooked.

No, i didn't overlook it..it's actually a website that i had used in the past but had forgotten about lately..thx for reminding me.

Warm regards,
Visham

bigearsbilly 09-08-2005 09:44 AM

;) J

jlliagre 09-08-2005 11:20 AM

Quote:

Do you mean to say that I will not be able to use the kill() function there?
Exactly. kill is a system call, and you can't use system calls from inside the kernel (Hmm, didn't I wrote that already ...).
Quote:

If no, what do you suggest me to do about what I want?
Do it the way around, have a userland process communicating with the kernel. One way to do it would be using the procfs facility.
Actually, my best suggestion would be to discourage you to start such a project which seems unreasonably overcomplicated. Kernel programming is a job for skilled veterans.
Quote:

Some one told me that we can declare global variable in /etc/profiles. Variables defined there can be accessed from anywhere - both kernel space and userspace code.
The one who told you that is confusing very different variables and has no clue about what means kernel space. Environment variables set in /etc/profiles are anyway not at all shared between processes, and definitely outside kernel scope.

vishamr2000 09-08-2005 12:18 PM

First of, many many thx for taking the time to explain all this to me..otherwise i would have been losing so much time on it.

One thing though..how does iptables kernelspace code iteract with iptables userspace code? Does it use the procfs facility?

And are there no instances in Linux where the kernel communicates with a userspace program (in terms of error messages, interrupts...)?

Warm regards,
Visham

jlliagre 09-08-2005 02:36 PM

Quote:

how does iptables kernelspace code iteract with iptables userspace code?
It is normally the way around.
Quote:

Does it use the procfs facility?
I don't think so, but it uses getsockopt() and setsockopt().
Quote:

And are there no instances in Linux where the kernel communicates with a userspace program (in terms of error messages, interrupts...)?
The kernel is a facilitator for userspace process communication. The scheduler is also responsible of the order and time slots each process will be granted the CPU. The kernel do send error messages to processes, but it can terminate them, dump cores, swap them out, but this can hardly be considered as communication. Of course error codes can be returned in reply to a system call, but the kernel is not the initiator of the dialogue.

vishamr2000 09-08-2005 02:58 PM

Quote:

The scheduler is also responsible of the order and time slots each process will be granted the CPU.
How does the scheduler interrupt a running process and then schedule another? Does the scheduler sends a SIGINT?

Quote:

The kernel do send error messages to processes
Can we force the kernel to send sth to a process. If yes, can't we send sth to my userspace program so that when it receives it, it knows that it has to execute.

Regards,
Visham

jlliagre 09-08-2005 03:16 PM

Quote:

How does the scheduler interrupt a running process and then schedule another? Does the scheduler sends a SIGINT?
It doesn't send a SIGINT, only processes send signals, the scheduler (in the case of preemptive scheduling) is just interrupting instantly the process, in a way absolutely transparent to the process which is unaware of it, and managing properly the context change to allow another process to take place.
Quote:

Can we force the kernel to send sth to a process. If yes, can't we send sth to my userspace program so that when it receives it, it knows that it has to execute.
You do not force the kernel to do something, but you can code part of of the kernel or modules that will do what you want, assuming you know enough of the kernel internals to do it, but this is poor design. Sending something to a process would imply that this process has code to receive and react to the message, which the kernel doesn't know. Logically, it is the process the one that should ask the kernel for information.

fakie_flip 09-08-2005 04:17 PM

the command "top" without quotes gets the processes and proabably their pid too. You can push control + escape to get a thing like task manager.

vishamr2000 09-09-2005 12:48 AM

Hi,

When i was saying that the kernelspace program has to send a signal to the userspace program, i didn't actually had in mind the use of signals or other system calls at first. Now, thx to you, I know it's not possible. I just wanted the kernelspace program to tell the userspace program to start its execution. This is the part I don't know how to do. This is where the problem lies.

Quote:

Sending something to a process would imply that this process has code to receive and react to the message, which the kernel doesn't know.
I don't what and how we can send. If we manage to send anything, then we can make the userspace program catch it. I don't want a 2-way communication between these two programs. The kernelspace program just send "the thing" and then continues its execution. Both execute independently. No results to be returned to the kernelspace program. It's only 1-way communication. It's as if the kernelspace program schedules the userspace program to run.

What do you think?

To fakie_flip: I don't think 'top' will work in kernelspace. Thx anyways..

Warm regards,
Visham

jlliagre 09-09-2005 01:26 AM

Quote:

The kernelspace program just send "the thing" and then continues its execution. Both execute independently.
You still view the kernel as an ordinary process, which it is not.

You can have the kernel sending something through a device driver (/proc for example).

If a process reads that piece of information, you have a communication from the kernel to a process.

vishamr2000 09-09-2005 01:35 AM

Yes..we can try to do that..

Do you have idea abt wat we can send? Do have any example of how to do it?

Pls do let me have it.

Warm regards,
Visham

jlliagre 09-09-2005 01:50 AM

No, but I'm sure there are tons of /proc programming examples available on the net, try google ...

vishamr2000 09-09-2005 08:46 PM

Ok..many thx to all who have contributed to this thread, esp jlliagre

Warm regards,
Visham

Lunar 03-02-2015 08:52 PM

Quote:

Originally Posted by vishamr2000 (Post 1835511)
Hi to all,

I would like to know if there's a way to get the pid of a process by using it's name. Also, how can I know of the processes that are running and their pids?

Warm regards,
Visham

# pidof (my go to)
# pstree
# top

and I like the first reply: ps ax | grep [any part of the process name]

Landis.

genss 03-02-2015 09:55 PM

Quote:

Originally Posted by Lunar (Post 5325979)
# pidof (my go to)
# pstree
# top

and I like the first reply: ps ax | grep [any part of the process name]

Landis.

quick tip: read the date stamp and the rest of the thread :)

jpollard 03-12-2015 07:12 AM

What is the problem you trying to solve?

There appears to be no need for a kernel module for this as

http://linux.die.net/man/3/libipq

Appears to solve most of what you are describing.


All times are GMT -5. The time now is 08:13 PM.