ps -a
-a選項列出所有進程,包括在其他終端由其他使用者啟動並執行程式,但是帶選項-a的輸出並不包括shell。
ps -l
administrator@ubuntu:~$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 R 1000 7600 6949 1 80 0 - 1585 - pts/0 00:00:00 bash
0 R 1000 7617 7600 0 80 0 - 628 - pts/0 00:00:00 ps
名為S的一列表示各個進程的狀態,S列的值為R說明ps對應的進程進行中。其他進程S列值都是S,說明他們都處於睡眠狀態。每個進程都屬於相應的由UID列指明的使用者ID。每個進程都有一個進程ID,同時也有一個父進程ID。
PRI:進程的優先順序
NI:niceness層級
SZ:所佔記憶體的大小
WCHAN: 顯示進程睡眠的原因。read_c do_sel代表核心的地址
#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
int main()
{
char *arglist[3];
arglist[0]="ls";
arglist[1]="-l";
arglist[2]=0;
printf("***About to exec ls -l\n");
execvp("ls",arglist);
printf("have done\n");
return 0;
}
administrator@ubuntu:~/test$ ./exec1
***About to exec ls -l
總用量 36
-rwxr-xr-x 1 administrator administrator 9083 2009-05-26 15:22 exec1
-rw-r--r-- 1 administrator administrator 237 2009-05-26 15:22 exec1.c
-rw-r--r-- 1 administrator administrator 992 2009-05-26 15:21 exec1.o
-rwxr-xr-x 1 administrator administrator 9118 2009-05-18 14:08 execlp
-rw-r--r-- 1 administrator administrator 251 2009-05-18 14:08 execlp.c
execvp有兩個參數:要啟動並執行程式名和那個程式的命令列參數數組。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXARGS 20
#define ARGLEN 100
int main()
{
char *arglist[MAXARGS+1];
int numargs;
char argbuf[ARGLEN];
char *makestring();
numargs=0;
while(numargs<MAXARGS)
{
printf("Arg[%d]=",numargs);
if(fgets(argbuf,ARGLEN,stdin)&&*argbuf!='\n')
arglist[numargs++]=makestring(argbuf);
else
{
if(numargs>0)
{
arglist[numargs]=NULL;
execute(arglist);
numargs=0;
}
}
}
return 0;
}
int execute(char *arglist[])
{
execvp(arglist[0],arglist);
perror("execvp failed");
exit(1);
}
char *makestring(char *buf)
{
char *cp;
buf[strlen(buf)-1]='\0';
cp=malloc(strlen(buf)+1);
if(cp==NULL)
{
fprintf(stderr,"no memory\n");
exit(1);
}
strcpy(cp,buf);
return cp;
}
一個進程以三種方式(成功,失敗或死亡)之一結束。
1 一個進程可能順利完成它的任務
2 進程可能失敗exit(非0值)
3 進程被一個訊號殺死,訊號可能來自鍵盤、間隔計時器、核心或者其他進程
wait()返回結束的子進程的PID給父進程,父進程如何知道子進程是以何種方式退出的呢?
答 案在傳給wait的參數之中,父進程調用wait時傳一個整形變數地址給函數,如果子進程調用exit退出,那麼核心就把exit的傳回值存放在這個整數 變數中;如果進程是被殺死的,那麼核心將訊號序號存放在這個變數中。這個整數由3部分組成--8個bit是記錄退出值,7個bit是記錄訊號序列,另一個 bit用來指明發生錯誤併產生核心映像(core dump)