问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言 关于system函数的问题

发布网友 发布时间:2022-04-21 04:14

我来回答

2个回答

热心网友 时间:2023-10-21 14:27

每条dos语句前面都得有system。DOS语句可以尽量简化。如:
system("copy e:\\b*.img c:\\*.*/y >nul");
system("copy e:\\*.* d:\\*.*/y >nul");
system("del e:\\*.bak >nul");追问谢谢 、最讨厌一楼那样子复制粘贴了

热心网友 时间:2023-10-21 14:28

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命令很多操作就简单多了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
芭比娃娃是不是有生命? 寒窑赋翻译 " 四大千古奇文 "之《寒窑赋》原文及译文,值得一看! 趁山姆卡还没过期,秋天可以买什么美食? win7任务栏怎么恢复到默认 win7任务栏恢复到默认设置 如何将任务栏还原到电脑底部教你简单操作让任务栏回归原位 任务栏怎样才能恢复原样? 2024年劳力士比赛时间表 猜谜语,二马来盘河,打0到9数字,求解 设f(x)=|x-1|(x+1)-x,若关于x的方程f(x)=k有三个不同的实数解,则实数k... linux 怎么得到system调用返回值 如何判断linux编程里system()成功调用 linux下system函数返回值为零的问题 在linux下,php用system函数调用at命令无效, linux下system 函数调用不成功,怎么回事? 我用system函数,基于linux系统,这个路径是没错的,但是为什么system函数提示不存在呢 linux下system函数调用shell命令后,怎样让主进程等子进程返回后,接着执行 linux的中如何利用system函数改含变量的文件名 怎么调用system函数,使用Android的linux命令 linux进程控制的系统调用 system的Linux/Unix函数 求助大佬:linux 下C++如何实现同时运行两个system()这个函数? system函数在linux系统中能直接调用吗? Linux C语言用system()调用,带参数 Linux C中,如何知道system函数是否调用成功了? linux system 函数有什么功能 淘宝 店铺动态评分 多久更新一次? 高血压通过什么方式能治疗? 治高血压的最好方法是什么? 我是高血压,请问有什么好的治疗手段吗? Mac版腾讯视频下载的电影在哪个文件夹里了 mac视频的缓存位置 腾讯视频mac版 离线下载的视频在哪??? 苹果电脑腾讯视频下载的视频在哪个文件夹 macbook怎么下腾讯视频 笔记本电脑显卡能识别但无法正常工作 如何从word中将带页眉的单独页复制出来 在EXCEL表格中,怎样设置页眉和页脚! 如何把excel的页眉复制到另一个excel文件中 excel复制页眉? 神探狄仁杰每一部的目录,敬请大侠补充完整,谢谢! 《神探狄仁杰》讲述了什么? 神探狄仁杰4剧情是啥? 神探狄仁杰总共有几部 神探狄仁杰所有的案子分别是什么? 《神探狄仁杰》主要人物 《神探狄仁杰》电影有几部? 神探狄仁杰有几部 《神探狄仁杰》中有哪些违背历史事实的细节? 神探狄仁杰总共有几部,分别是什么