puts(buffer
should be
puts(buffer);
Main Topics
Browse All TopicsDear all, I need to write a little C program that runs in SunOs, which gets virtual memory information from the kernel (such as what vmstat displays) and prints them on the screen. Would someone please give me a sample code which demonstrate what header files to include, how to call library files (.so if needed) and how to obtain information about virtual memory.
Thank you very much.
This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.
Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.
If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.
Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.
Access the answers to your technology questions today.
30-day free trial. Register in 60 seconds.
Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Try it out and discover for yourself.
30-day free trial. Register in 60 seconds.
Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.
Thank you very much for your answer, rbr, however, I need to get those information from the kernel. As I've mentioned in the question, I need to know which header file or library file to call or include, eg. kstat.h, vmsystm.h etc. by the way, I tried running your code in SunOs, it was giving me an error: "Segmentation Fault".
Thanks for helping.
Regards.
Hi thoellri, here's the output
SunOS deneb 5.5.1 Generic sun4c sparc SUNW,Sun_4_60
Please allow me to repeat that the program must get virtual memory information from the kernel directly, no cheats. The reason for me saying this is because there have been several friends who suggested other ways to do it.
Thank you very very much for your help.
Regards.
Hope this helps
Tobias
/*
Compile with: gcc -o kstat kstat.c -lkstat
Execute as: kstat
Will display the free memory, reserved swap, avail swap and free swap every second. Read sys/sysinfo.h and kstat.h include files.
*/
#include <stdio.h>
#include <kstat.h>
#include <sys/sysinfo.h>
#define BYTES_PER_PAGE 8192
#define KBYTE 1024
#define MUL (BYTES_PER_PAGE/KBYTE)
void main(int argc, char*argv[])
{
kstat_ctl_t *kc;
kstat_t *ksp;
int first=1;
vminfo_t last,vm;
kc = kstat_open();
while(1) {
ksp = kstat_lookup(kc, "unix", 0, "vminfo");
if (ksp) {
kstat_read(kc, ksp, &vm);
if (first) {
first=0;
} else {
printf("------------------
printf("freemem =%8llu KByte\n",(vm.freemem-last.
printf("reserved swap =%8llu KByte\n",(vm.swap_resv-las
printf("allocated swap=%8llu KByte\n",(vm.swap_alloc-la
printf("avail swap =%8llu KByte\n",(vm.swap_avail-la
printf("free swap =%8llu KByte\n",(vm.swap_free-las
}
last=vm;
}
sleep(1);
kstat_chain_update(kc);
}
kstat_close(kc);
exit(0);
}
Thank you very very much, thoellri. The program works fine. However, I would like to ask several questions.
1. why are we defining BYTES_PER_PAGES, KBYTE and MUL?
2. how do I use other structs in sysinfo.h, eg. cpu_vminfo?
Please don't give your answers as comments because I can't reward you in this way. I have slightly increased the points, just to show my appreciation.
Once again thank you very very much and regards.
Skywalker,
I always use comments first to make sure I don't block out the answer for others. Once the person who asks is satisfied I usually repost the last comment as an answer. And, I hate to have rejected answers :-)
Regarding 1: The information returned from the kstat-calls specifies the vm-information in pages. A page is (usually) 8192 bytes. I wanted to show the result in KBytes, which is why I multiple the result from kstat-calls by 8192 and then divide by 1024 to get KBytes. MUL ends up to be 8 in our case. The result from kstat-calls is thus multiplied by 8.
There are ways to find the pagesize on Sun systems (and others). Look at:
#include <unistd.h>
int getpagesize(void);
Regarding 2: Look at the cpu_stat_t structure and you'll see that it contains the cpu_vminfo structure. Now you just need to find the right "names" for kstat_lookup to get to the structure. I've added a little function called print_chain which print all the entries in the list returned from kstat_open(). So add this little function to your c-code:
void print_chain(kstat_ctl_t *kc)
{
kstat_t *ksp;
for (ksp = kc->kc_chain; ksp != NULL; ksp = ksp->ks_next) {
printf("Module: %s Class: %s Name: %s\n", ksp->ks_module, ksp->ks_class, ksp->ks_name);
}
}
And call it right after the kstat_open() as in "print_chain(kc);"
You'll see a long list when you start the program like this:
Module: unix Class: kstat Name: kstat_headers
Module: unix Class: kstat Name: kstat_types
Module: unix Class: misc Name: sysinfo
Module: unix Class: vm Name: vminfo
Module: unix Class: hat Name: vmhatstat
...and so on
Further down in the list you'll see an entry which says:
Module: cpu_stat Class: misc Name: cpu_stat0
This is the one we want for our little exercise. Now you have to replace the kstat_lookup() call to search for "cpu_stat", 0,"cpu_stat0" and if you get a valid ksp, then do the kstat_read, but this passing a pointer to a cpu_stat_t structure, which will be filled in for you.
If you're generally interested in this area you may want to take a look at the SE-toolkit which simplifies handling these structures: http://www.sun.com/sun-on-
Hope this helps
Tobias
Dear thoellri, sorry to trouble you again, I've tried your little function and here are the warning message I've got
kstat.c:42: warning: type mismatch with previous external decl
kstat.c:17: warning: previous external decl of `print_chain'
kstat.c:42: warning: type mismatch with previous implicit declaration
kstat.c:17: warning: previous implicit declaration of `print_chain'
kstat.c:42: warning: `print_chain' was previously implicitly declared to return
`int'
but the program runs just fine. However, I do have something that I don't understand
"Now you have to replace the kstat_lookup() call to search for "cpu_stat", 0, "cpu_stat0" and if you get a valid ksp, then do the kstat_read, but this passing a pointer to a cpu_stat_t structure, which will be filled in for you."
I don't quite understand the above paragraph. Would you please explain in greater detail, hopefully through an example, if you don't mind :p
yet, another question, can you tell me a little about LD_LIBRARY_PATH.
I have increased the points again just to show my appreciation.
Thank you very much and regards.
SkyWalker,
here is the complete code again. I guess you forgot to copy the "void" in front of print_chain, because I don't get the warning here.
Anyway, I added the cpu_stat thingie which you can see in the code below. As we accessed the vminfo-structure I also access the cpu_stat structure which contains a hell of a lot of information. The kstat_lookup("cpu_stat"...
LD_LIBRARY_PATH: Is used in two contexts. First the linking context, where LD_LIBRARY_PATH is defined during an ld-operation. It then defines a list of directories in which to search for libraries specified with the -l option. Multiple directories are separated by a colon. In the most general case, it will contain two directory lists separated by a semi-colon:
dirlist1;dirlist2
If ld is called with any number of occurrences of -L, as in:
ld ... -Lpath1 ... -Lpathn ...
then the search path ordering is:
dirlist1 path1 ... pathn dirlist2 LIBPATH
When the list of directories does not contain a semicolon, it is interpreted as dirlist2.
The second (and more important context) where LD_LIBRARY_PATH is used, is to specify library search directories to the runtime linker. That is, if LD_LIBRARY_PATH exists in the environment, the runtime linker will search the directories named in it, before its default directory, for shared objects to be linked with the program at execution.
Note: When running a set-user-ID or set-group-ID program, the runtime linker will only search for libraries in any full pathname specified within the executable as a result of a runpath being specified when the executable was constructed, or in /usr/lib. Any library dependencies specified as relative pathnames will be silently ignored.
Example: The "usual" LD_LIBRARY_PATH for SunOS5.5.1 systems looks like this one:
LD_LIBRARY_PATH=/usr/lib:/
Now, I happen to have built some shared libraries which are needed to execute certain programs. These shared libraries are installed in /usr/local/lib. Without special arguments ot the link-editor (ld) and without adjusting my LD_LIBRARY_PATH the system will tell me that a certain library (.so file) cannot be found when I try to execute a program which relies on a shared library in /usr/local/lib. The solution:
LD_LIBRARY_PATH=$LD_LIBRAR
I have this line in my shell-startup file and it will add the "/usr/local/lib" directory to the runtime linkers search path.
Another solution involves the -R option for the link-editor, which allows you to embed certain search-paths into an executable. Have a look at the ld-manpage.
To see the runtime-linker in action and to get a feel for it, try the following secrets :-)
I assume you use bourne shell ? Or ksh ? and not the evil csh :-( Enter the following:
LD_DEBUG=files ls
Enter it eactly as written, there is a space between "files" and "ls". This tells the runtime linker to spit out some information about the files it processes. And another one which will probably blow you away:
LD_DEBUG=bindings ls
You'll see exactly what shared libraries get pulled in for what symbols - neat?
Hope this is enough
Tobias
#include <stdio.h>
#include <kstat.h>
#include <sys/sysinfo.h>
#define BYTES_PER_PAGE 8192
#define KBYTE 1024
#define MUL (BYTES_PER_PAGE/KBYTE)
void print_chain(kstat_ctl_t *kc)
{
kstat_t *ksp;
for (ksp = kc->kc_chain; ksp != NULL; ksp = ksp->ks_next) {
printf("Module: %s Class: %s Name: %s\n", ksp->ks_module, ksp->ks_class, ksp->ks_name);
}
}
void main(int argc, char*argv[])
{
kstat_ctl_t *kc;
kstat_t *ksp;
int first=1;
vminfo_t vmlast,vm;
cpu_stat_t statlast, cpu_stat;
kc = kstat_open();
print_chain(kc);
while(1) {
ksp = kstat_lookup(kc, "unix", 0, "vminfo");
if (ksp) {
kstat_read(kc, ksp, &vm);
if (!first) {
printf("------------------
printf("freemem =%8llu KByte\n",(vm.freemem-vmlas
printf("reserved swap =%8llu KByte\n",(vm.swap_resv-vml
printf("allocated swap=%8llu KByte\n",(vm.swap_alloc-vm
printf("avail swap =%8llu KByte\n",(vm.swap_avail-vm
printf("free swap =%8llu KByte\n",(vm.swap_free-vml
}
vmlast=vm;
}
ksp = kstat_lookup(kc, "cpu_stat", 0, "cpu_stat0");
if (ksp) {
kstat_read(kc, ksp, &cpu_stat);
if (!first) {
printf("stat:syscall =%8lu\n",
cpu_stat.cpu_sysinfo.sysca
}
statlast=cpu_stat;
}
first=0;
sleep(1);
kstat_chain_update(kc);
}
kstat_close(kc);
exit(0);
}
Dear thoellri, the program works perfectly, thank you very very much. Just for curiousity sack, I was comparing the results from this program to the result from "vmstat 1", I found that the values are quite different, do you know how each individual in vmstat is derived?
Thank you very much and regards.
Business Accounts
Answer for Membership
by: rbrPosted on 1999-04-26 at 22:52:04ID: 1261016
If you only want the memory info read out /proc/meminfo
"r");
#include <stdio.h>
FILE *fp=fopen("/proc/meminfo",
char buffer[201];
while (NULL != fgets(buffer,200,fp))
puts(buffer
fclkose (fp);