system函数与popen函数的介绍与使用

system函数与popen函数的介绍与使用


前言

fgets是C语言中用于从文件或流中读取字符串的函数。

函数原型:

char *fgets(char *str, int n, FILE *stream);

参数:

  • str: 指向一个字符数组的指针,该数组用于存储从stream中读取的字符串。
  • n: 要读取的最大字符数(包括最后的空字符)。通常,这是字符数组的大小。
  • stream: 要读取的输入流,例如stdin(标准输入)或一个文件指针。

返回值:

  • 如果成功,函数返回相同的str参数。
  • 如果到达文件末尾或发生读取错误,函数返回NULL

注意事项:

  • 读取的字符串会包括换行符(如果有)。
  • 读取的字符串在n-1字符或换行符后会自动添加一个null字符(‘\0’)以确保字符串的结束。

使用示例:

  1. 从标准输入读取字符串:
#include <stdio.h>

int main() {
    char buffer[100];

    printf("请输入一段文字:");
    fgets(buffer, sizeof(buffer), stdin);
    printf("您输入的是: %s", buffer);

    return 0;
}
  1. 从文件中读取字符串:
#include <stdio.h>

int main() {
    char buffer[100];
    FILE *fp = fopen("example.txt", "r");

    if (fp == NULL) {
        perror("打开文件失败");
        return 1;
    }

    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        printf("%s", buffer);
    }

    fclose(fp);
    return 0;
}

在上述文件读取示例中,我们使用fgets在循环中逐行读取文件内容,直到到达文件的末尾。


一、函数原型

  1. system函数:
#include <stdlib.h>
int system(const char *command);
  • 参数: command - 要执行的命令字符串。
  • 返回值: 这个函数返回命令的退出状态或错误码。如果出错,返回-1。如果成功执行命令但命令失败,则返回命令的退出状态。
  1. popen函数:
#include <stdio.h>
FILE *popen(const char *command, const char *type);
  • 参数:
    • command - 要执行的命令字符串。
    • type - 指定模式,通常是"r"(读取模式)或"w"(写入模式)。
  • 返回值: 如果成功,则返回一个文件指针,该指针可以用于读取命令的输出(当type"r"时)或向命令写入数据(当type"w"时)。如果出错,返回NULL。

二、使用步骤

1.system函数

#include <stdio.h>
#include <stdlib.h>

int main() {
    int status;

    // 使用system函数执行ls -l命令
    status = system("ls -l");
    printf("命令退出状态: %d\n", status);

    return 0;
}

2.popen函数

#include <stdio.h>

int main() {
    FILE *fp;
    char output[512];

    // 使用popen以读取模式运行ls -l命令
    fp = popen("ls -l", "r");
    if (fp == NULL) {
        perror("popen错误");
        return 1;
    }

    // 读取命令的输出
    while (fgets(output, sizeof(output), fp) != NULL) {
        printf("%s", output);
    }

    // 关闭文件指针
    pclose(fp);
    return 0;
}

注意: popen开启的流在使用完后应当使用pclose来关闭,而不是使用fclose。这是因为pclose会等待子进程完成并返回命令的终止状态,而fclose则不会。


总结

1.popen 函数会在当前进程的当前工作目录中执行指定的命令。换句话说,它运行命令的位置是从哪里调用 popen 函数的进程的工作目录。

如果你在终端或命令行界面中运行程序,并且你没有在程序中更改工作目录(例如,使用 chdir 函数),那么 popen 会在你启动程序的那个目录中执行命令。

如果你需要检查或更改当前的工作目录,你可以使用以下函数:

  • getcwd(): 获取当前工作目录
  • chdir(): 更改当前工作目录

例如,要在程序中检查当前工作目录,你可以这样做:

#include <stdio.h>
#include <unistd.h>

int main() {
    char cwd[1024];
    if (getcwd(cwd, sizeof(cwd)) != NULL) {
        printf("当前工作目录: %s\n", cwd);
    } else {
        perror("获取工作目录失败");
        return 1;
    }
    return 0;
}

要更改工作目录,你可以使用 chdir() 函数。例如:

chdir("/path/to/directory");

这将影响所有后续的文件和目录操作,包括 popen 调用的命令执行位置。

2.system函数,与popen函数一样,也是在当前进程的当前工作目录中执行指定的命令。它的运行路径是从哪里调用system函数的进程的工作目录。

换句话说,当你使用system函数运行命令时,它会在你的程序当前的工作目录中运行。如果你在程序中没有明确地更改工作目录(例如,通过使用chdir函数),那么工作目录将是你启动程序的目录(如果你从命令行或终端运行的话)。

例如,如果你在/home/user/目录中运行了一个程序,而该程序内部调用了system("ls"),那么这将列出/home/user/目录的内容,除非在程序中更改了工作目录。

如果你想在不同的目录中运行system命令,你可以在调用之前使用chdir函数更改工作目录,或者在system命令字符串中明确指定路径。例如:

system("/path/to/directory/some_command");

chdir("/path/to/directory");
system("some_command");

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值