c/c++中system函数在Linux和windows下区别
windows
在windows下的system函数中命令可以不区别大小写!
功 能: 发出一个DOS命令
#include <stdlib.h> int system(char *command);
执行成功返回0,执行不成功由于不同的操作返回的值不同,可以查手册看
#include<stdio.h> #include<stdlib.h> int main() { printf("About to spawn and run a DOS command\n"); system("dir"); return 0; }
调用color函数可以改变控制台的前景色和背景,具体参数在下面说明。
用 system(“color 0A”); 其中color后面的0是背景色代号,A是前景色代号。各颜色代码如下:
0=黑色 1=蓝色 2=绿色 3=湖蓝色 4=红色 5=紫色 6=黄色 7=白色 8=灰色 9=淡蓝色 A=淡绿色 B=淡浅绿色 C=淡红色 D=淡紫色 E=淡黄色 F=亮白色
自动关机代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char order[10]; system("color 0C");//设置默认控制台前景个背景色 system("date /T");//该函数可以返回当前系统日期 system("TIME /T");//该函数可以返回当前系统时间 flag: printf("输入\"我是猪\",否则电脑两分钟关机!!!\n"); system("shutdown -s -t 120"); scanf("%s",order); if(strcmp(order,"我是猪")==0) { printf("恭喜你成功的定位自己的身份!!!关机动作取消\n"); system("shutdown -a"); system("pause"); } else goto flag; return 0; }
定时关机:
#include<stdio.h> #include<stdlib.h> //可以输入system用以键入DOS管理窗口界面下的cmd中的命令 #include<string.h> void print() { printf("****************关机程序****************\n"); printf("****1.实现在十分钟内的定时关闭计算机****\n"); printf("****2.立即关闭计算机********************\n"); printf("****3.注销计算机************************\n"); printf("****4.取消自动关机**********************\n"); printf("****5.退出系统**************************\n"); } int main() { system("title C语言关机程序");//设置cmd窗口宽度 system("color 2C");//设置默认控制台前景个背景色 system("date /T"); system("TIME /T"); char cmd[20] = "shutdown -s -t "; char t[5]; print(); flag: printf("请输入您的选择1-5:"); int c; scanf("%d", &c); if(c>5||c==0) { printf("您输入的不合法,请重新输入.\n"); fflush(stdin); goto flag; } getchar(); switch(c) { case 1: printf("您想在多少秒后自动关闭计算机?(0~600)\n"); scanf("%s", t); system(strcat(cmd, t)); break; case 2: system("shutdown -p"); break; case 3: system("shutdown -l"); break; case 4: system("shutdown -a"); case 5: return 0; default: printf("Error!\n"); } system("pause"); return 0; }
删除文件:
#include<stdio.h> #include<stdlib.h> int main() { system("del d:\123.txt"); return 0; }
Linux
system源码
#include <sys/wait.h> #include <erron.h> #include <signal.h> #include <unistd.h> int system(const char* cmdstring) { pid_t pid; int status; struct sigaction ignore,saveintr,savequit; sigset_t chldmask,savemask; if(cmdstring==NULL) return 1; ignore.sa_handler=SIG_IGN; if(sigaction(SIGINT,&ignore,&saveintr)<0) return -1; if(sigaction(SIGQUIT,&ignore,&savequit)<0) return -1; sigemptyset(&chldmask); sigaddset(&chldmask,SIGCHLD); if(sigpromask(SIG_BOLCK,&chllmask,&savemask) return -1; if((pid=fork())<0) status=-1; else if(pid==0) { sigaction(SIGINT,&saveintr,NULL); sigaction(SIGQUIT,&savequit,NULL); sigpromask(SIG_SETMASK,&savemask,NULL); execl("/bin/sh","sh","-c",cmdstring,(char*)0); _exit(127); } else { while(waitpid(pid,&status,0)<0) { if(errno!=EINTR) { status=-1; break; } } if(sigaction(SIGINT,&saveintr,NULL)<0) return -1; if(sigaction(SIGQUIT,&savequit,NULL)<0) return -1; if(sigpromask(SIG_SETMASK,&savemask,NULL)<0) return -1; } return status; }
man:system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed. During execution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored.
如果父进程正在捕捉SIGCHLD信号,那么正在执行system函数的时候,应当阻塞对父进程递送SIGCHLD信号.否则,当system创建的子进程结束的时候,system的调用者可能错误的认为,它自己的一个子进程结束了.于是,调用者将会调用一种wait函数以获得子进程的终止状态,这样就阻止了system函数获得子进程的终止状态,并将其作为返回值。
- 在该command执行期间,SIGCHLD是被阻塞的,收不到内核发送的SIGCHLD信号
- 在该command执行期间,SIGINT和SIGQUIT是被忽略的,意思是进程收到这两个信号后没有任何动作。
返回值
- fork一个子进程
- 在子进程中调用exec函数去执行command
- 在父进程中调用wait去等待子进程结束
- 对于fork失败,system()函数返回-1
注意:
- 如果exec执行成功,也即command顺利执行完毕,则返回command通过exit或return返回的值。(注意,command顺利执行不代表执行成功,比如command:"rm debuglog.txt",不管文件存不存在该command都顺利执行了)
- 如果exec执行失败,也即command没有顺利执行,比如被信号中断,或者command命令根本不存在,system()函数返回127.
- 如果command为NULL,则system()函数返回非0值,一般为1.
- command命令返回0时,system返回0
- 如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno来确认执行成功
- 在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。system函数已经被收录在标准c库中,可以直接调用
system("mkdir $HOME/.SmartPlatform/"); system("mkdir $HOME/.SmartPlatform/Files/"); system("cp mainnew.cpp $HOME/.SmartPlatform/Files/");