亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言中system()函數的用法總結

2020-01-26 15:43:12
字體:
來源:轉載
供稿:網友

system()函數功能強大,很多人用卻對它的原理知之甚少先看linux版system函數的源碼:

復制代碼 代碼如下:

#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>

int system(const char * cmdstring)
{
    pid_t pid;
    int status;


    if(cmdstring == NULL){     
         return (1);
    }


    if((pid = fork())<0){
            status = -1;
    }

    else if(pid = 0){
        execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
        -exit(127); //子進程正常執行則不會執行此語句
        }

    else{
           while(waitpid(pid, &status, 0) < 0){
                if(errno != EINTER){
                    status = -1;
                    break;
                }
            }
        }

        return status;
}


分析一下原理估計就能看懂了:  

當system接受的命令為NULL時直接返回,否則fork出一個子進程,因為fork在兩個進程:父進程和子進程中都返回,這里要檢查返回的pid,fork在子進程中返回0,在父進程中返回子進程的pid,父進程使用waitpid等待子進程結束,子進程則是調用execl來啟動一個程序代替自己,execl("/bin/sh", "sh", "-c", cmdstring, (char*)0)是調用shell,這個shell的路徑是/bin/sh,后面的字符串都是參數,然后子進程就變成了一個shell進程,這個shell的參數是cmdstring,就是system接受的參數。在windows中的shell是command,想必大家很熟悉shell接受命令之后做的事了。

再解釋下fork的原理:當一個進程A調用fork時,系統內核創建一個新的進程B,并將A的內存映像復制到B的進程空間中,因為A和B是一樣的,那么他們怎么知道自己是父進程還是子進程呢,看fork的返回值就知道,上面也說了fork在子進程中返回0,在父進程中返回子進程的pid。

windows中的情況也類似,就是execl換了個又臭又長的名字,參數名也換的看了讓人發暈的,我在MSDN中找到了原型,給大家看看:

復制代碼 代碼如下:

HINSTANCE   ShellExecute(
               HWND   hwnd,
               LPCTSTR   lpVerb,
               LPCTSTR   lpFile,
               LPCTSTR   lpParameters,
               LPCTSTR   lpDirectory,
               INT   nShowCmd
   );  

用法見下:
ShellExecute(NULL,   "open",   "c://a.reg",   NULL,   NULL,   SW_SHOWNORMAL);  

你也許會奇怪 ShellExecute中有個用來傳遞父進程環境變量的參數 lpDirectory,linux中的execl卻沒有,這是因為execl是編譯器的函數(在一定程度上隱藏具體系統實現),在linux中它會接著產生一個linux系統的調用 execve, 原型見下:
int execve(const char * file,const char **argv,const char **envp);

看到這里就會明白為什么system()會接受父進程的環境變量,但是用system改變環境變量后,system一返回主函數還是沒變。原因從system的實現可以看到,它是通過產生新進程實現的,從我的分析中可以看到父進程和子進程間沒有進程通信,子進程自然改變不了父進程的環境變量。

使用了system函數就能執行dos指令。

復制代碼 代碼如下:

#include <stdio.h>
#include <stdlib.h>
xiaoyu()
{
char *a;
int n=0;
FILE *f;
f=fopen("file.bat","w+");/*新建一個批處理*/
if(f==NULL)
exit(1);
    a="echo"; /*DOS命令*/
    for(n=65;n<=90;n++)/*大寫A-Z*/
    fprintf(f,"%s %c/n",a,n);/*利用ASCII碼輸出A-Z,寫出批處理*/
    fclose(f);
    system("file.bat");/*運行批處理*/
}
main()
{
    char *string;
    xiaoyu();
    string="echo C語言的system函數/n";/*輸出中文*/
    system(string);
    system("pause");/*程序暫停*/
}

C中可以使用DOS命令,以后編程通過調用DOS命令很多操作就簡單多了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97欧美精品一区二区三区| 日韩精品电影网| 国产精品福利小视频| www.xxxx欧美| 欧美大秀在线观看| 欧美激情精品久久久久久变态| 国产一区二区在线免费| 97在线精品视频| 最近2019年好看中文字幕视频| 精品国产一区二区三区在线观看| 亚洲国产精品成人精品| 色婷婷综合成人av| 亚洲最新av网址| 啪一啪鲁一鲁2019在线视频| 日韩国产在线播放| 欧美综合国产精品久久丁香| 亚洲成人av中文字幕| 欧美色道久久88综合亚洲精品| 668精品在线视频| 亚洲激情成人网| 日韩视频在线免费观看| 欧美激情极品视频| 国产欧美精品日韩| 欧美另类在线观看| 国产精品成人va在线观看| 九九精品视频在线观看| 最近免费中文字幕视频2019| 亚洲第一福利网| 久久久久久久久亚洲| 97av在线影院| 亚洲欧美国产va在线影院| 国产精品女人网站| 欧美日韩国产999| 国产亚洲免费的视频看| 精品成人乱色一区二区| 亚洲人成77777在线观看网| 国产97人人超碰caoprom| 欧美国产视频日韩| 91精品久久久久久久久不口人| 人人澡人人澡人人看欧美| 国产欧美va欧美va香蕉在| 欧美乱人伦中文字幕在线| 57pao成人国产永久免费| 日韩在线资源网| 2021久久精品国产99国产精品| 精品香蕉一区二区三区| 国产精品露脸av在线| 欧美日韩高清区| 大伊人狠狠躁夜夜躁av一区| 午夜精品福利在线观看| 日韩hd视频在线观看| 91在线免费观看网站| 亚洲欧美日韩一区二区在线| 尤物九九久久国产精品的特点| 亚洲天堂色网站| 日韩欧美中文第一页| 国产成人极品视频| 成人在线观看视频网站| 欧美成人在线免费视频| 成人免费高清完整版在线观看| 亚洲综合成人婷婷小说| 日韩中文在线不卡| 日韩一区二区精品视频| 午夜精品三级视频福利| 91精品国产91久久久久久吃药| 欧美激情精品久久久久| 欧美肥老妇视频| 韩国v欧美v日本v亚洲| 欧美一级视频免费在线观看| 91亚洲一区精品| 日韩免费在线观看视频| 日韩av电影在线播放| 最近中文字幕mv在线一区二区三区四区| 色综合久综合久久综合久鬼88| 亚洲成人久久久久| 亚洲美女av网站| 亚洲第一av网站| 中文字幕一精品亚洲无线一区| 亚洲国产精彩中文乱码av在线播放| 亚洲欧洲一区二区三区久久| 日韩一区二区三区xxxx| 精品精品国产国产自在线| 国产成人精品视频在线观看| 亚洲欧美日韩第一区| 国产美女精彩久久| 国产精品极品美女在线观看免费| 日本一区二区在线免费播放| 日韩欧美国产一区二区| 国产综合在线看| 色偷偷av一区二区三区| 狠狠干狠狠久久| 国产成人精品综合久久久| 在线观看国产精品91| 中文字幕久热精品在线视频| 日韩av在线天堂网| 久久琪琪电影院| 亚洲色图校园春色| 欧美亚洲第一页| 国产福利视频一区二区| 亚洲国产第一页| 国产精品96久久久久久又黄又硬| 操91在线视频| 欧美日韩午夜视频在线观看| 国产综合在线看| 人九九综合九九宗合| 日韩一区av在线| 91亚洲精品在线观看| 九九视频这里只有精品| 亚洲成人精品视频| 亚洲一区二区三区四区视频| 久久久久久12| 日韩av免费在线观看| 欧美中文在线视频| 亚洲国内精品视频| 欧美成人精品激情在线观看| 欧美寡妇偷汉性猛交| 亚洲国产成人精品久久| 亚洲天堂av网| 黑人精品xxx一区| 日韩中文字幕精品| 亚洲一区二区三区乱码aⅴ| 综合激情国产一区| 欧美在线激情网| 精品国产鲁一鲁一区二区张丽| 亚洲三级 欧美三级| 亚洲人成绝费网站色www| 亚洲人成电影网站色www| 亚洲色图综合网| 国产脚交av在线一区二区| 国模极品一区二区三区| 中文字幕精品网| 欧美寡妇偷汉性猛交| 精品爽片免费看久久| 欧美在线观看日本一区| 美女精品久久久| 欧美亚洲一区在线| 北条麻妃一区二区在线观看| 亚洲国产欧美一区二区三区同亚洲| 久久免费少妇高潮久久精品99| 久久成人综合视频| 国产精品88a∨| 日韩精品视频在线观看网址| 亚洲精品综合久久中文字幕| 另类图片亚洲另类| 日韩中文字幕在线播放| 国产偷亚洲偷欧美偷精品| 亚洲欧洲第一视频| 久久亚洲国产精品| 国产在线观看不卡| 97在线观看免费| 在线成人中文字幕| 欧美一级淫片播放口| 久久精品国产成人精品| 国产综合久久久久久| 日韩美女av在线免费观看| 中文字幕日韩在线观看| 亚洲精品suv精品一区二区| 色视频www在线播放国产成人| 亚洲无限av看| 久久99精品久久久久久琪琪| 久久久久久com| 亚洲最大福利视频| 7777精品视频| 国产日韩欧美91|