1. 程式人生 > >利用fork和execve執行程式

利用fork和execve執行程式

#include <wait.h>
#include <stdio.h>
#include <zconf.h>
#include <cstdlib>
#include <cstring>
#include <cerrno>


#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmissing-noreturn"

int builtin_command(char **argv);

int parse_line(char *, char **argv);

void eval(char *cmd_line);

int main(int argc, char **argv) {

    char cmd_line[8888];

    while (1) {
        printf(">");
        fgets(cmd_line, 8888, stdin);
        cmd_line[(strlen(cmd_line))] = '\0';

        printf(" len:%d", strlen(cmd_line));
        eval(cmd_line);

    }

}

int builtin_command(char **argv) {
    if (strcmp(argv[0], "quit") == 0)
        exit(0);
    if (strcmp(argv[0], "&") == 0)
        return 1;
    return 0;
}

void eval(char *cmd_line) {
    printf("eval \n");
    char *cmd_buf = cmd_line;
    char *argv[1000];

    printf("%d", strlen(cmd_buf));;
    int bg = parse_line(cmd_buf, argv);


    if (argv[0] == NULL) {
        return;
    }


    pid_t pid;
    if (builtin_command(argv) == 0) {
        if ((pid = fork()) == 0) {
            if (execve(argv[0], argv, environ) < 0) {
                printf("%s :Command not found .\n", argv[0]);
                exit(0);
            }

        }
        printf("bg=%d\n",bg);
        if (!bg) {
            int status;
            if (waitpid(pid, &status, 0) < 0) {
                fprintf(stderr, "%s", strerror(errno));
                exit(0);
            }
        } else
            printf("%d %s", pid, cmd_line);

    }

    return;


}


int parse_line(char *cmd_buf, char **argv) {

    char *delim;
    int argc=0;
    int bg;

    cmd_buf[strlen(cmd_buf) - 1] = ' ';

    while (*cmd_buf && (*cmd_buf == ' '))
        cmd_buf++;

    while ((delim = strchr(cmd_buf, ' '))) {
        argv[argc++] = cmd_buf;
        *delim = '\0';
        cmd_buf = delim + 1;
        while (*cmd_buf && (*cmd_buf == ' '))
            cmd_buf++;
    }


    argv[argc] = NULL;


    if (argc == 0)
        return 1;




    if ((bg = (*argv[argc - 1] == '&')) != 0) {
        argv[--argc] = NULL;

    }
    return bg;
}


相關推薦

利用forkexecve執行程式

#include <wait.h> #include <stdio.h> #include <zconf.h> #include <cstdlib> #include <cstring> #include <c

Java 利用佇列執行緒的思想完成使用者排隊買票。

要求:可以通過ArrayList或LinkedList介面完成佇列的建立,可以實現入隊、出隊等操作。新定義類利用多執行緒的思想完成買票和賣票的同步操作。 程式碼: import java.util.ArrayList; import java.util.EmptyStackException

opencv交叉編譯arm環境庫,靜態,動態庫執行程式

在工作中遇到把基於opencv的程式碼移植到板子上執行,在網上查看了很多資料,嘗試了兩種方案,都是可行的 1.把opencv程式碼用ndk的方式編譯成可執行檔案,直接放到板子上執行,這種方式是最便捷的不用考慮板子上其他程式的干擾 附上ndk編譯程式碼,準備好下面兩個檔案後,

Visual Studio2008 2010 執行程式出現的黑框立即消失解決方法

1 在程式最後加         system("PAUSE");  要注意包含標頭檔案#include"stdlib.h"   //system需要呼叫這個   2 程式末尾加函式getchar(); getchar()是等待使用者輸入字元的函式,如果程式沒有getcha

從整理上理解進程創建、可執行文件的加載進程執行進程切換,重點理解分析forkexecve進程切換

files 修改 eve rdquo ces 堆棧分配 初始 data led 一.進程的創建   Linux創建進程是通過子進程復制父進程所擁有的資源來實現的。現代Linux通過寫時復制、共享數據等方法優化這一過程,提高創建子進程的效率。   在Linux中,進程創建

從矩陣乘法來看-O優化ijk執行順序對程式效能的影響

從矩陣乘法來看-O優化和ijk執行順序對程式效能的影響 根據計算矩陣乘積的c程式,主要想做想做兩件事情: 統計採用不同的優化選項編譯程式所用的時間,感受-O優化帶來的效能提升。 看看矩陣乘法中不同迴圈順序對程式效能的影響: 改變三重迴圈的順序,統

Java利用waitnotify實現執行緒間通訊

       Java的Object類提供了wait和notify方法用於實現執行緒間通訊(因為所有的java類都繼承了Object類,所以所有的java類都有這兩個方法)。這兩個方法在Object類中籤名如下: pu

關於檔案的副檔名區別原始檔、目標程式檔案、可執行程式檔案

1.在C 語言中,當你把程式碼敲出來後,就應該儲存它,但在儲存的時候應該注意要在檔名的最後打上字尾名.c,表示這個程式碼是C語言的原始檔。當你要執行這個程式碼的時候,c語言的執行軟體就只會執行c語言的原始檔,也就是不加上字尾名.c會使得執行軟體無法順利執行該檔案 2.原始檔的副檔名 .c

利用JavaXML配置檔案執行MBG

利用Java和XML配置檔案執行MBG 新增相應jar包:mybatis-generator-core-xxx.jar 配置xml檔案:generatorConfig.xml 新增相應Java程式碼 generatorConfig.xml &l

多程序執行緒簡單tcp聊天程式

如果需要一個服務端可以連線多個客戶端,並同時與多個(不超多listen第二個引數及最大同時併發數)客戶端通訊,可以利用多程序即建立子程序,子程序來完成服務端的接受和傳送資料;也可以建立多個執行緒。對於tcp一些介面具體使用可以檢視這篇部落格:https://bl

winform 呼叫外部程式執行

1.呼叫外部程式 Process outProcess = new Process(); //初始化 outProcess.StartInfo.File

python Windows計劃任務執行程式指令碼

up主第一次設定計劃任務,著實摸索了一會……才找到正確的方法,特來分享給大家: 第一步:開始選單開啟計劃任務 第二步:建立基本任務 第三步:填寫引數 建議最好把描述寫寫清除,不然過個把月,很容易就忘記這個是幹啥的了。  設定時間,後一直點選下一步

網路程式設計實驗四——利用多程序執行緒實現伺服器端的併發處理

一、實驗目的 1.在TCP檔案傳輸程式碼的基礎上,利用多程序實現伺服器端的併發處理。  2.利用多執行緒實現伺服器端的併發處理。 二、實驗原理 併發的面向連線伺服器演算法: 主1、建立套接字並將其繫結到所提供服務的熟知地址上。讓該套接字保持為無連線的。 主2、將

網路程式設計——4.利用多程序執行緒實現伺服器端的併發處理

一、實驗要求     在TCP檔案傳輸程式碼的基礎上,利用單執行緒程序併發模型和多執行緒併發模型實現伺服器端的併發處理。 二、實驗分析     多執行緒與多程序相比,使用多執行緒相比多程序有以下兩個優點:更高的效率和共享儲存器,效率的提高源於上下文切換次數的減少。

Linux 下後臺執行程式,檢視關閉後臺執行程式

1、執行.sh檔案 直接用./sh 檔案就可以執行,但是如果想後臺執行,即使關閉當前的終端也可以執行的話,需要nohup命令和&命令。 (1)&命令           功能:加在一個命令的最後,可以把這個命令放在後臺執行 (2)nohup命令

利用htmlunitjsoup來實現爬取js的動態網頁實踐(執行js)

更新,這就尷尬了,這篇文章部落格閱讀文章最多,但是被踩得也最多。 爬取思路: 所謂動態,就是通過請求後臺,可以動態的改變相應的html頁面,頁面並不是一開始就全部展現出來的。 大部分操作都是通過請求完成的,一次請求,一次返回。而在大多數網頁中請求往往都被開發者隱藏在了js程

Visual Studio修改可執行程式的檔名路徑

 通常我們使用Visual Studio建立的專案工程,生成的可執行程式檔名與工程的名稱一致,例如工程名為Test,則生成的可執行檔案檔名通常為Test.exe。但有時候我們希望工程生成的可執行檔

python電腦鬧鐘定時執行python程式

#本文也是兩塊內容 1.python電腦鬧鐘 import winsound import time my_hour = input('請輸入時:') my_minute = input('請輸入分:') print('您的鬧鈴已設定成功!等待它叫醒你吧~~~~') while

網易公開課《Linux核心分析》學習心得-Linux核心如何裝載啟動一個可執行程式

實驗 設定斷點sys_execeve,並繼續 程式碼執行到了SyS_execve。在QEMU中執行exec,可以看到只能出現兩句,沒有完全執行完畢。 設定斷點load_elf_binary和start_thread,並執行,可以看到程式碼停在了

Qt Creator下載安裝(詳細教程)以及如何釋出可執行程式

簡介 Qt是跨平臺的圖形開發庫,目前由Digia全資子公司 Qt Company 獨立運營,官方網址: http://www.qt.io/  也可以訪問Qt專案域名:http://qt-project.org/  Qt本身支援眾多作業系統。從通用作業系統Linux、Wind