linux_system函数

system函数原型

头文件: #include<stdlib.h>

参数:char的指针

返回值:system()函数的返回值如下: 成功,则返回进程的状态值; 当sh不能执行时,返回127; 失败返回-1;

  #include <stdlib.h>
  int system(const char *command);

//system函数源码
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;
}

源码讲解:当pid=0时进入子进程,else之后的意思父进程等待子进程退出,进入子进程调用exec,执行cmd,所以说system函数是exec族函数封装

根据之前所学exec配合fork的代码可以进行修改

//q3.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sys/wait.h>

int main()
{
        pid_t pid;
        int data = 10;

        while(1)
        {
                printf("please inputa data\n");
                scanf("%d",&data);
                if(data == 1){
                        pid = fork();
                        if(pid >0){
                                wait(NULL);
                        }
                        if(pid == 0){
                                system("./changedata config.txt");
                                exit(1);
                        }

                }
        }
        return 0;
}

实验结果

 

<think>嗯,用户现在想了解`systemtime()`函数的含义和用法,以及它和`clock()`、`time()`的区别。首先,我需要确定`systemtime()`到底是指哪个函数,因为在C/C++标准库中并没有直接叫做`systemtime()`的函数。可能用户指的是Windows API中的`GetSystemTime()`或者`SYSTEMTIME`结构体。根据用户提供的引用[4],里面提到了`GetLocalTime(&p);`和`SYSTEMTIME p;`,所以可以确定用户指的是Windows API中的`SYSTEMTIME`结构体及相关函数。 接下来,我需要整理`SYSTEMTIME`的作用和用法。`SYSTEMTIME`是Windows平台特有的结构体,用于保存日期和时间信息,包括年、月、日、时、分、秒、毫秒等。通常与`GetSystemTime()`和`GetLocalTime()`函数一起使用,前者获取UTC时间,后者获取本地时间。用户可能需要知道如何声明和初始化这个结构体,以及如何获取时间值。 然后,比较`SYSTEMTIME`相关的函数与`clock()`和`time()`的区别。`clock()`用于测量CPU时间,返回程序运行的处理器时间,而`time()`返回自Epoch以来的秒数,即日历时间。而`SYSTEMTIME`提供更详细的时间信息,包括毫秒,并且是平台特定的,不同于标准C库中的函数。需要强调跨平台和精度方面的差异。 用户可能混淆了函数名称,比如把`GetSystemTime()`简称为`systemtime()`,所以需要明确指出正确的函数名和用法。同时,用户可能关心如何在Windows环境下获取更精确或更详细的时间,所以需要说明`SYSTEMTIME`的优势,比如毫秒级精度,以及如何通过Windows API实现这一点。 还要注意用户之前的问题是关于`clock()`和`time()`的区别,现在扩展到Windows特定函数,可能需要说明不同平台的选择建议。比如,标准库函数适合跨平台,而Windows API适合需要更高精度或特定功能的场景。 另外,用户提供的引用[4]中有示例代码,可能需要引用该例子来说明`SYSTEMTIME`的使用方法,比如如何获取并格式化时间。同时需要指出Windows API与标准C函数的区别,比如头文件包含、函数调用方式等。 最后,总结三者区别时,要分功能定位、精度、平台支持等方面,用表格或对比列表让信息更清晰。确保回答结构清晰,帮助用户逐步理解每个函数的作用和应用场景,避免混淆。</think>### `SYSTEMTIME`结构体与`clock()`/`time()`的全面对比解析 #### 一、`SYSTEMTIME`的本质(Windows平台专用) 1. **功能定义** `SYSTEMTIME`是**Windows API中用于存储日期时间的结构体**,包含年、月、日、星期、时、分、秒、毫秒的完整时间信息,**精度达到1毫秒**。需配合`GetSystemTime()`(UTC时间)或`GetLocalTime()`(本地时间)函数使用[^4]。 2. **结构体定义** ```c typedef struct _SYSTEMTIME { WORD wYear; // 年份(如2023) WORD wMonth; // 月份(1-12) WORD wDayOfWeek; // 星期(0=周日,1=周一...) WORD wDay; // 日期(1-31) WORD wHour; // 小时(0-23) WORD wMinute; // 分钟(0-59) WORD wSecond; // 秒(0-59) WORD wMilliseconds; // 毫秒(0-999) } SYSTEMTIME; ``` 3. **典型应用场景** ```c #include <windows.h> #include <stdio.h> int main() { SYSTEMTIME st; GetLocalTime(&st); // 获取本地时间 printf("%04d-%02d-%02d %02d:%02d:%02d.%03d\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); return 0; } ``` **输出示例**:`2023-08-25 14:35:22.478` --- #### 二、与标准库函数的对比 | 维度 | `SYSTEMTIME` (Windows API) | `clock()` | `time()` | |-----------------|----------------------------------|---------------------------|--------------------------| | **功能定位** | 高精度时间获取与格式化 | CPU时间测量 | 系统日历时间记录 | | **精度** | 毫秒级 | 微秒级(Linux)/毫秒级(Win) | 秒级 | | **返回值类型** | 结构化时间数据 | CPU时钟周期数(`clock_t`) | UNIX时间戳(`time_t`) | | **跨平台性** | 仅限Windows系统 | 跨平台(C标准) | 跨平台(C标准) | | **内存占用** | 16字节结构体 | 4/8字节整型 | 4/8字节整型 | | **典型用途** | 日志时间戳、GUI时钟显示 | 算法耗时分析 | 时间差计算、文件时间记录 | --- #### 三、核心区别详解 1. **数据维度差异** - `SYSTEMTIME`提供**完整的时间分量**(精确到毫秒),可直接用于时间显示 - `time()`仅返回**从1970年1月1日开始的秒数**,需通过`localtime()`转换 - `clock()`反映**程序占用的CPU时间**,与物理时间无直接关联 2. **精度对比实验** ```c #include <windows.h> #include <time.h> #include <stdio.h> int main() { // 对比时间获取方式 SYSTEMTIME st; GetLocalTime(&st); time_t t = time(NULL); struct tm *tm_info = localtime(&t); clock_t c = clock(); printf("SYSTEMTIME: %03dms\n", st.wMilliseconds); printf("time(): %02d秒\n", tm_info->tm_sec); printf("clock(): %d ticks\n", c); return 0; } ``` **典型输出**: ``` SYSTEMTIME: 782ms time(): 45秒 clock(): 15630 ticks ``` 3. **多线程场景表现** - `SYSTEMTIME`与`time()`均反映实时系统时钟 - `clock()`在多线程中会累计所有线程的CPU时间 - 示例:启动10个线程执行计算 ```c // clock()显示总CPU时间 ≈ 单线程时间×10 // SYSTEMTIME/time()显示物理时间 ≈ 单线程时间 ``` --- #### 四、开发建议 1. **优先使用场景** - 需要**毫秒级时间戳** → `SYSTEMTIME` - 测量**代码段性能** → `clock()`(注意跨平台差异) - 记录**事件发生时间** → `time()`+`localtime()` 2. **跨平台方案** ```cpp // C++11推荐方式 #include <chrono> #include <iostream> int main() { auto now = std::chrono::system_clock::now(); auto ms = std::chrono::duration_cast<std::chrono::milliseconds>( now.time_since_epoch()).count(); std::cout << "毫秒时间戳: " << ms << std::endl; return 0; } ``` 3. **精度陷阱规避** - Windows下`clock()`精度问题: ```c // 需手动提高计时精度(Windows API) TIMECAPS tc; timeGetDevCaps(&tc, sizeof(TIMECAPS)); timeBeginPeriod(tc.wPeriodMin); // 开启高精度模式 // ...执行计时操作... timeEndPeriod(tc.wPeriodMin); // 恢复默认 ``` --- #### 五、扩展知识:Windows时间API体系 | API函数 | 特点 | 精度 | |------------------|-------------------------------|------------| | `GetTickCount()` | 获取系统启动后的毫秒数 | ±10-16ms | | `QueryPerformanceCounter()` | 高性能计数器 | 纳秒级 | | `GetSystemTimePreciseAsFileTime()` | Win8+精确时间 | 100ns级 | [^1]: 关于`clock()`函数的实现细节与精度验证方法 [^4]: Windows平台时间获取的API调用示例
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值