c++ fork, execl 参数 logcat | grep

发布时间:2024年01月10日

Linux进程编程(PS: exec族函数、system、popen函数)_linux popen函数会新建进程吗-CSDN博客

execvp函数详解_如何在C / C ++中使用execvp()函数-CSDN博客

C语言的多进程fork()、函数exec*()、system()与popen()函数_c语言 多进程-CSDN博客

Linux---fork函数和exec函数_fork exec-CSDN博客

#include <unistd.h>
 
int main() {
    pid_t childPid = fork(); //创建子进程
    
    if (childPid == -1) {
        perror("fork");
        return 1;
    } else if (childPid == 0) {
        // 子进程的代码
        
        char* args[] = {"/bin/sh", "-c", "logcat | grep", NULL};
        int result = execvp(args[0], args);
        
        if (result == -1) {
            perror("execvp");
            exit(EXIT_FAILURE);
        }
    } else {
        // 父进程的代码
        
        waitpid(childPid, NULL, 0); //等待子进程结束
    }
    
    return 0;
}



#include <iostream>
#include <stdio.h>
#include <unistd.h> // for getpid() function
#include <sys/wait.h>
#include <string.h>
#include <chrono>
#include <thread>
#include <unistd.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


int main() {

    char *p = (char*)malloc(5000);
    strcpy(p, "ifsddsffdsdsdfsfdssdffds");

    pid_t pid = fork(); // 创建子进程

    if (pid > 0) {
        int status;

        // wait(&status); // 等待子进程结束
        std::this_thread::sleep_for(std::chrono::milliseconds(3000));

        // std::string cmd_str = "kill -9  " + std::to_string(pid);
        //pkill -TERM -P 27888
        std::string cmd_str = "pkill -TERM -P  " + std::to_string(pid);
        auto ret = system(cmd_str.c_str());
        std::cout << "Child process ID is: " << pid << std::endl;
    } else if (pid == 0) {
        char *a = (char*)malloc(100);
        // std::this_thread::sleep_for(std::chrono::milliseconds(3000));


#if 1
        std::string cmd_log = "/home/zeekr/code/test/test";

        // 关闭标准输入、输出和错误流
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);

        // 打开要写入的文件
        int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);

        // 设置新的标准输出为指定文件
        dup2(fd, STDOUT_FILENO);

        // 执行需要重定向的命令
        // execlp("/bin/ls", "ls", "-la", NULL);
        // execlp(cmd_log.c_str(), "test", "3", NULL);

        // execl(cmd_log.c_str(),"test", "3", ">a.txt 2>&1",NULL);

        char* args[] = {"/bin/sh", "-c", "logcat | grep xxx", NULL};
        int result = execvp(args[0], args);

        if (result == -1) {
            perror("execvp");
            exit(EXIT_FAILURE);
        }


		// execl("/bin/ls", "ls", "-l", NULL);
		perror("Child failed to exec ls");

		//execl后面的代码都不会执行了
		printf("chlid end\n");

		exit(0);//让子进程到这里就结束



#elif 0
        std::string cmd_log = "top > a.txt  2>&1 ";
        auto status = system(cmd_log.c_str());

        printf("system: %d\n", status);

        std::this_thread::sleep_for(std::chrono::milliseconds(30000));

        printf("exit(EXIT_SUCCESS);\n");

        exit(EXIT_SUCCESS);

#elif 0

        std::string cmd_log = "top > a.txt  2>&1 ";
        FILE* pipe = popen(cmd_log.c_str(), "r"); // 这里以"ls"命令为例,也可以根据需求修改成其他命令或脚本
        if (pipe == nullptr) {
            std::cout << "Failed to create child process." << std::endl;
            return -1;
        }

        // 子进程部分
        char buffer[256];
        while (!feof(pipe)) {
            fgets(buffer, sizeof(buffer), pipe);

            printf("result: %s\n", buffer);
        }
        pclose(pipe); // 关闭管道

        printf("pclose(pipe); : %s\n", buffer);

        exit(EXIT_SUCCESS);
#endif
    } else {
        std::cerr << "Fork failed!" << std::endl;
        return -1;
    }

    return 0;
}











文章来源:https://blog.csdn.net/sun007700/article/details/135462147
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。