C语言system()函数

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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命令很多操作就简单多了。

 

system()函数及其在C语言编程中的应用 在C语言编程中,system()函数是一个非常有用的函数,用于执行操作系统命令。综上所述,system()函数是C语言编程中一个强大的函数,可用于执行操作系统命令、运行其他可执行文件等。需要注意的是,system()函数的使用需要小心,特别是当执行用户提供的命令时。在上面的示例中,我们使用system()函数执行了一个简单的shell命令"ls -l",该命令用于列出当前目录下的文件和文件夹。在上面的示例中,我们使用system()函数来执行名为"another_program"的可执行文件。 阅读详情

相关推荐

C语言system()函数详解

函数原型 包含在头文件 “stdlib.h” 中 int system(const char * command) 函数功能 执行 dos(windows系统) 或 shell(Linux/Unix系统) 命令,参数字符串command为命令名。另,在windows系统下参数字符串不区分大小写。 说明:在windows系统中,system函数直接在控制台调用一个command命令。 在Linux...

dark_cy的博客 19万+

全网最全c++中的system详解

1,简介system()函数是在C++制作中十分常用,有用的一个函数。其效果类似于系统中"cmd"控制台和"bat"文件。通常会在C++字符游戏,和C++整蛊程序中使用。其形式是以:system("***");呈现。

HenryC0509的博客 2万+

详解C语言system()函数,一个函数让初学者的代码有趣(一)

首先使用system函数要包含头文件#include ,system函数可以通过调用一些命令来实现一些特殊的功能,我们这里直接就开始讲解了,主要是为了让大家可以先快速上手,之后会出一篇更详细的讲解。

freed_Day的博客 1万+

Linux下system () 函数详解简介,system()与execl()的区别,popen()

Linux下system () 函数详解简介,system()与exec()的区别

ken2232的博客 8473

system()函数详解及用法

System()用于调用一些DOS命令,执行dos(windows系统) 或 shell(Linux/Unix系统) 命令,参数字符串command为命令名。在windows系统,system函数直接在控制台调用一个command命令;在Linux/Unix系统中,system函数会调用fork函数产生子进程,由子进程来执行command命令,命令执行完后随即返回原调用的进程。system的原型函数为:int system(const char * command)

JDSNYD的博客 4989

c语言system()函数的使用

瘟都死下system()函数使用,直接上代码 #include #include int main() { system("title 控制软件"); system("color c0"); int key; printf("输入你想做的事情!\n"); printf("1.打开记事本\n"); printf("2.打开计算器\n"); p

代码改变人生 1万+

c语言标准库函数system,system() - C语言函数

C库函数int system(const char *command)通过指定的命令要执行的命令处理器并返回主机环境的命令后,已经完成的命令名称或程序名。声明以下是system() 函数的声明。intsystem(constchar*command)参数command-- 这是C的字符串,其中包含所需的变量的名称。返回值返回的值是-1错误,否则命令的返回状态。例子下面的例子演示了如何使用 s...

weixin_33653182的博客 485

c语言system title,system() – C语言函数

C库函数int system(const char *command)通过指定的命令要执行的命令处理器并返回主机环境的命令后,已经完成的命令名称或程序名。声明以下是system() 函数的声明。intsystem(constchar*command)参数command– 这是C的字符串,其中包含所需的变量的名称。返回值返回的值是-1错误,否则命令的返回状态。例子下面的例子演示了如何使用 syste...

weixin_35912164的博客 1127

c语言 system头文件,C语言的一个函数system()

C语言的一个函数system()C语言的一个函数system()C语言中一个函数system(); 使用时必须包含头文件stdlib.h​它可以调用操作系统底层的SHELL命令。比如::Windows下的 CMD.exe命令行的命令。system("pause");///暂停程序的运行。system("notepad");///相当于打开了命令行,调用命令notepad,打开了软件记事本。syst...

weixin_34160181的博客 6988

C语言中的 system() 函数用法详解

在本篇博客中,我们详细讲解了 C 语言中的system()函数及其常见用法。通过system(),你可以轻松地调用操作系统的命令来执行清屏、启动程序、修改窗口设置等任务。但在使用system()时,需要小心其安全性和跨平台兼容性问题。编程技巧总结谨慎使用system(),确保命令字符串来自可信来源。使用fgets()获取用户输入,避免缓冲区溢出。检查system()的返回值,处理潜在错误。希望本篇博客能够帮助你更好地理解并使用system()函数。如果你有任何问题或建议,欢迎在评论区留言讨论!

Huazzi的博客 1174

关闭C语言system()函数的回显

C语言system(const char *command)函数用来执行系统命令,执行完毕后打印结果。有些时候我们并不需要执行结果的回显,可以用下面的方法关闭。 第一种方法是将回显重定向到nul,如下system("taskkill /im process.exe>nul 2>nul"); 其中2表示错误流。 第二种方法是关闭回显,如下 system("@echo off\ntaskki

p0x1307的专栏 3861

c语言system全部用法,简述C语言system()函数与vfork()函数的使用方法

C语言system()函数:执行shell命令头文件:#include 定义函数:int system(const char * string);函数说明:system()会调用fork()产生子进程, 由子进程来调用/bin/sh-c string 来执行参数string 字符串所代表的命令, 此命令执行完后随即返回原调用的进程. 在调用system()期间SIGCHLD 信号会被暂时搁置,SI...

weixin_30711223的博客 516

c语言利用system()函数启动exe程序_C 语言简单编程速成

我们将所有的 C 语言要素放置到一份易读的备忘录上。• 来源:linux.cn • 作者:Seth Kenlon • 译者:郑 •(本文字数:5500,阅读时长大约:8 分钟)我们将所有的 C 语言要素放置到一份易读的备忘录上。1972 年, 丹尼斯·里奇(Dennis Ritchie)任职于 贝尔实验室(Bell Labs),在几年前,他和他的团队成员发明了 Unix 。在创建了一个经久不衰的操...

weixin_33328213的博客 736

C语言system()函数的用法

C语言system()函数的用法 1.函数简介 C语言中,system函数可以用于调用一些DOS命令,比如system(“pause”)可以卡主系统控制台,而另一个常用的system(“cls”)为清屏命令,等于在DOS上使用cls命令。 2.函数支持库及原型 (1)函数原型int system(char *command); (2)函数支持库:stdlib.h 3.函数返回值 (1)=-1:出现...

weixin_45096408的博客 8659

c语言system能识别字符串吗,简述C语言system()函数与vfork()函数的使用方法

C语言system()函数:执行shell命令头文件:#include 定义函数:int system(const char * string);函数说明:system()会调用fork()产生子进程, 由子进程来调用/bin/sh-c string 来执行参数string 字符串所代表的命令, 此命令执行完后随即返回原调用的进程. 在调用system()期间SIGCHLD 信号会被暂时搁置,SI...

weixin_39951181的博客 252

linux c语言system函数 调用变量,C++_简述C语言system()函数与vfork()函数的使用方法,C语言system()函数:执行shell命 - phpStudy...

简述C语言system()函数与vfork()函数的使用方法C语言system()函数:执行shell命令头文件:#include 定义函数:int system(const char * string);函数说明:system()会调用fork()产生子进程, 由子进程来调用/bin/sh-c string 来执行参数string 字符串所代表的命令, 此命令执行完后随即返回原调用的进程. 在...

weixin_39607798的博客 399

c语言system函数 linux,C语言system()函数的用法总结

system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码:#include #include #include #include int system(const char * cmdstring){pid_t pid;int status;if(cmdstring == NULL){return (1);}if((pid = fork())<0){s...

weixin_31190099的博客 1920
上一篇: Java基本类型与包装类
下一篇: gdb调试
koches
博客等级 码龄15年 70粉丝 28原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值