linux windows c system 函数简介

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;
}

自动关机代码:

#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函数获得子进程的终止状态,并将其作为返回值。

  system()函数调用/bin/sh来执行参数指定的命令,/bin/sh 一般是一个软连接,指向某个具体的shell,比如bash,-c选项是告诉shell从字符串command中读取命令;

  1. 在该command执行期间,SIGCHLD是被阻塞的,收不到内核发送的SIGCHLD信号
  2. 在该command执行期间,SIGINT和SIGQUIT是被忽略的,意思是进程收到这两个信号后没有任何动作。

返回值

  The value returned is -1 on error (e.g. fork(2) failed), and the return status of the command otherwise. This latter return status is in the format specified in wait(2). Thus, the exit code of the command will be WEXITSTATUS(status). In case /bin/sh could not be executed, the exit status will be that of a command that does exit(127).If the value of command is NULL, system() returns nonzero if the shell is available, and zero if not.

  system执行流程

  1. fork一个子进程
  2. 在子进程中调用exec函数去执行command
  3. 在父进程中调用wait去等待子进程结束
  4. 对于fork失败,system()函数返回-1

注意:

  1. 如果exec执行成功,也即command顺利执行完毕,则返回command通过exit或return返回的值。(注意,command顺利执行不代表执行成功,比如command:"rm debuglog.txt",不管文件存不存在该command都顺利执行了)
  2. 如果exec执行失败,也即command没有顺利执行,比如被信号中断,或者command命令根本不存在,system()函数返回127.
  3. 如果command为NULL,则system()函数返回非0值,一般为1.
  4. command命令返回0时,system返回0
  5. 如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno来确认执行成功
  6. 在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。system函数已经被收录在标准c库中,可以直接调用
system("mkdir $HOME/.SmartPlatform/"); 
system("mkdir $HOME/.SmartPlatform/Files/"); 
system("cp mainnew.cpp $HOME/.SmartPlatform/Files/"); 
发布了57 篇原创文章 · 获赞 538 · 访问量 486万+

猜你喜欢

转载自blog.csdn.net/whatday/article/details/104052755