Unix/Linux編程實踐教程 筆記8 進程和程式:編寫命令直譯器sh

來源:互聯網
上載者:User
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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.