linuxc中调用shell命令不阻塞

worktile 其他 109

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    在Linux C中调用Shell命令可以使用`system()`函数,该函数可以调用系统的Shell命令并执行,但是它在执行过程中是阻塞的,也就是说调用`system()`函数后,程序会等待Shell命令执行完毕后再继续执行。

    然而,如果你想要在调用Shell命令时不阻塞程序的执行,可以使用`popen()`函数。`popen()`函数可以创建一个子进程,执行指定的Shell命令,并返回一个文件指针。可以使用这个文件指针从子进程中读取命令的输出结果。

    下面是一个示例代码:

    “`c
    #include
    #include

    int main()
    {
    FILE *fp;
    char buffer[1024];

    // 调用Shell命令不阻塞程序
    fp = popen(“ls -l”, “r”);

    // 读取命令输出结果
    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
    printf(“%s”, buffer);
    }

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

    return 0;
    }
    “`

    在上述代码中,我们调用了`popen()`函数来执行Shell命令`ls -l`,并将返回的文件指针赋值给`fp`变量。然后通过`fgets()`函数从文件指针读取命令的输出结果,并将其打印出来。最后通过`pclose()`函数关闭文件指针。

    这样,程序就可以在调用Shell命令时不阻塞执行,而是可以继续执行其他的代码。

    2年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    在Linux中,我们可以使用多种方法在C语言程序中调用shell命令而不阻塞程序的执行。下面是五种常用的方法:

    1. 使用fork和exec
    这是最基本的方法。通过调用fork函数,创建一个子进程,然后在子进程中调用exec函数来执行shell命令。这样,父进程和子进程可以并发执行,不会相互阻塞。

    “`c
    #include
    #include
    #include
    #include
    #include

    int main() {
    pid_t pid = fork();

    if (pid == 0) {
    // Child process
    execl(“/bin/sh”, “sh”, “-c”, “your_command”, (char *)0);
    exit(0);
    } else if (pid > 0) {
    // Parent process
    int status;
    waitpid(pid, &status, 0);
    printf(“Command executed\n”);
    } else {
    // Error
    printf(“Fork failed\n”);
    }

    return 0;
    }
    “`

    2. 使用system函数
    系统提供了一个system函数,可以直接调用shell命令,让其在新的进程中执行。system函数会阻塞当前进程,直到shell命令执行完毕。

    “`c
    #include
    #include

    int main() {
    int result = system(“your_command”);
    printf(“Command executed with result: %d\n”, result);
    return 0;
    }
    “`

    3. 使用popen函数
    popen函数可以打开一个管道,然后在该管道中执行shell命令,并返回一个文件指针。这个文件指针可以用来读取执行结果。

    “`c
    #include
    #include

    int main() {
    FILE *fp = popen(“your_command”, “r”);

    if (fp == NULL) {
    printf(“Failed to execute command\n”);
    return -1;
    }

    char buffer[1024];
    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
    printf(“%s”, buffer);
    }

    pclose(fp);

    return 0;
    }
    “`

    4. 使用pthread库
    通过创建一个单独的线程,在该线程中执行shell命令,可以让程序继续执行其他任务,不会被命令阻塞。

    “`c
    #include
    #include
    #include

    void *thread_func(void *arg) {
    system(“your_command”);
    pthread_exit(NULL);
    }

    int main() {
    pthread_t thread;
    pthread_create(&thread, NULL, thread_func, NULL);

    // Continue with other tasks
    printf(“Continuing execution\n”);

    pthread_join(thread, NULL);

    return 0;
    }
    “`

    5. 使用无阻塞I/O
    通过设置文件描述符为非阻塞模式,可以在调用系统函数执行shell命令时,程序不会被阻塞。

    “`c
    #include
    #include
    #include

    int main() {
    int fd = open(“/dev/null”, O_WRONLY);
    int saved_stdout = dup(STDOUT_FILENO);
    dup2(fd, STDOUT_FILENO);

    system(“your_command”);

    dup2(saved_stdout, STDOUT_FILENO);
    close(saved_stdout);
    close(fd);

    return 0;
    }
    “`

    以上是在Linux中调用shell命令而不阻塞程序执行的五种常用方法。根据具体的需求和场景,选择适合的方法来实现非阻塞调用。

    2年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    在Linux系统中,可以使用多种方法调用Shell命令而不阻塞程序的执行。下面将介绍三种常用的方法:使用fork和exec函数、使用system函数以及使用popen函数。

    1. 使用fork和exec函数
    这是一种使用较低级别的系统调用来实现的方法。通过fork函数创建一个子进程,然后在子进程中调用exec函数来执行Shell命令。这样可以在父进程中继续执行其他代码而不阻塞。具体操作流程如下:

    “`c
    #include
    #include
    #include
    #include
    #include

    int main() {
    pid_t pid = fork();

    if (pid == -1) {
    perror(“fork() error”);
    exit(1);
    } else if (pid == 0) {
    // 子进程中
    execl(“/bin/sh”, “sh”, “-c”, “command”, (char*)NULL);
    exit(0);
    } else {
    // 父进程中
    int status;
    waitpid(pid, &status, 0);
    if (WIFEXITED(status)) {
    printf(“Command exited with status %d\n”, WEXITSTATUS(status));
    }
    }

    return 0;
    }
    “`

    2. 使用system函数
    system函数是C标准库中提供的一个高级函数,它可以调用Shell命令并等待其执行完成。在调用system函数时,程序会阻塞直到Shell命令执行完成,并且可以通过system函数的返回值获得Shell命令的返回值。具体操作流程如下:

    “`c
    #include
    #include

    int main() {
    int ret = system(“command”);
    if (ret == -1) {
    perror(“system() error”);
    exit(1);
    } else {
    printf(“Command exited with status %d\n”, ret);
    }

    return 0;
    }
    “`

    3. 使用popen函数
    popen函数可以打开一个管道,并执行一个Shell命令。通过popen函数,可以实现非阻塞的执行Shell命令,并通过管道读取命令的输出。具体操作流程如下:

    “`c
    #include
    #include

    #define BUFFER_SIZE 128

    int main() {
    FILE *pipe = popen(“command”, “r”);
    if (pipe == NULL) {
    perror(“popen() error”);
    exit(1);
    }

    char buffer[BUFFER_SIZE];
    while (fgets(buffer, BUFFER_SIZE, pipe) != NULL) {
    printf(“%s”, buffer);
    }

    pclose(pipe);

    return 0;
    }
    “`

    以上是三种常用的在LinuxC中调用Shell命令不阻塞的方法。每种方法都有其适用的场景,具体选择哪种方法应该根据实际需求来决定。

    2年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部