做业务oooooooooooo

#include <unistd.h> //read
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h> //EAGAIN
#include <sys/wait.h>
#include <stdlib.h>

#include <string.h> //strerror(errno)
#include <signal.h>

// #include “linked_list.c”

void* print(const void* data) {
printf(“%d”, *(int *)data);
printf(“\n”);

return (int *)data;

}

void my_strncpy( char *brr, const char arr, const char arr_end)
{
char
p= brr;
const char
q= arr;
for(; q < arr_end; )
{
*p=*q;
p++;
q++;
}
printf(“%s\n”,brr);
}

void sig_child(int signo)
{
pid_t pid;
//处理僵尸进程, -1 代表等待任意一个子进程, WNOHANG代表不阻塞
while ((pid = waitpid(-1, NULL, WNOHANG)) > 0)
{
printf(“child %d terminated.\n”, pid);
}
}

void run_comand(char envp, char argv[], int old_fd, int new_fd)
{
printf(“%d, %d\n”, (int)new_fd, (int)old_fd);
dup2(new_fd, old_fd);
//close(fd);
//printf(“–%s—%s-----”, (char*)envp, (char*)argv[0], (char*)argv[1]);

execvp(envp, argv);
//dup2(old_fd, new_fd);

}

int main()
{
// linked_list * list1 = create_linked_list();
// int p1 = 1;
// int p2 = 2;
// int p3 = 3;

// add_tail_linked_list(list1, &p1);
// add_tail_linked_list(list1, &p2);
// add_tail_linked_list(list1, &p3);

// traverse_linked_list(list1, print);

// getchar();
// // destroy_linked_list(list1);

int fp = open(“commandSample1.txt”, O_RDONLY);
if (-1 == fp)
{
printf(“%d, %s\n”, errno, strerror(errno)); //打印错误码,并把errno的数字转换成相应的文字
perror(“open err”); //打印错误原因的字符串
}

char buf[1024];
int n;
n = read(fp, buf, sizeof(buf));
if (n < 0)
{
    // 如果为非阻塞,但是没有数据可读,此时全局变量 errno 被设置为 EAGAIN
    if (errno != EAGAIN)
    {
        perror("read error");
        return -1;
    }
    printf("没有数据\n");
}

//printf("n = %d, %s\n", n, (char *)buf);

//行数
int lineNum = 1;
for(char *p = buf; p < buf + n; ++p) {
    if(*p == '\n') {
        lineNum++;
    }
}

char str[lineNum][100];

char *p = buf;
char *origin_p = buf;
int i = 0;
for(p = buf; p < buf + n; ++p) {
    if(*p == '\n') {
        my_strncpy(str[i], origin_p, p);
        origin_p = p + 1;
        i++;
    }
}
my_strncpy(str[i], origin_p, p);

for(int i = 0; i < 3; ++i) {
    printf("%s %ld----\n", str[i], strlen(str[i]));
}

int out_fd1 = open("output1.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);
if (-1 == out_fd1)
{
    perror("open"); 
    return 1;
}

// char argv[3][10];
// char *envp;

// for(int j = 0; j < 1; ++j) {
//     char *q = str[j];
//     char *origin_q = str[j];
//     int k = 0;
//     for(q = str[j] ; q < str[j] + strlen(str[j]); ++q) {
//         if(*q == ' ') {
//             my_strncpy(argv[k], origin_q, q);
//             origin_q = q + 1;
//             k++;
//         }

//         printf("p: %c\n", *q);
//     }
//     my_strncpy(argv[k], origin_q, q);
//     envp = argv[0];

//     run_comand(envp, argv, 1, out_fd1);
// }

// char argv[3][10];
// char *envp;
// for(int j = 0; j < 3; ++j) {
//     char *q = str[j];
//     char *origin_q = str[j];
//     int k = 0;
//     for(q = str[j] ; q < str[j] + strlen(str[j]); ++q) {
//         if(*q == ' ') {
//             my_strncpy(argv[k], origin_q, q);
//             origin_q = q + 1;
//             k++;
//         }

//         printf("p: %c\n", *q);
//     }
//     my_strncpy(argv[k], origin_q, q);
//     envp = argv[0];

//     run_comand(envp, argv, out_fd1, 1);
// }

// for(int j = 0; j < 3; ++j) {
//     char *q = str[j];
//     char *origin_q = str[j];
//     int k = 0;
//     for(q = str[j] ; q < str[j] + strlen(str[j]); ++q) {
//         if(*q == ' ') {
//             my_strncpy(argv[k], origin_q, q);
//             origin_q = q + 1;
//             k++;
//         }

//         printf("p: %c\n", *q);
//     }
//     my_strncpy(argv[k], origin_q, q);
//     envp = argv[0];

//     run_comand(envp, argv, out_fd1, 1);
// }

pid_t pid;
// 创建捕捉子进程退出信号
// 只要子进程退出,触发SIGCHLD,自动调用sig_child()
signal(SIGCHLD, sig_child);
pid = fork();   // 创建进程
if (pid < 0)
{ // 出错
    perror("fork error:");
    exit(1);
}
else if (pid == 0)
{ // 子进程
    printf("I am child process,pid id %d.I am exiting.\n", getpid());
    
    char argv[3][10];
    char *envp;

    for(int j = 0; j < 1; ++j) {
        char *q = str[j];
        char *origin_q = str[j];
        int k = 0;
        for(q = str[j] ; q < str[j] + strlen(str[j]); ++q) {
            if(*q == ' ') {
                my_strncpy(argv[k], origin_q, q);
                origin_q = q + 1;
                k++;
            }

            printf("p: %c\n", *q);
        }
        my_strncpy(argv[k], origin_q, q);
        envp = argv[0];


        // char *envp1[] = {envp, NULL};
        // char *argv1[] = {argv1[0], argv1[1], NULL};
        // execvp(envp, argv);
        run_comand(envp, argv, 1, out_fd1);
    }
    
    exit(0);
}
else if (pid > 0)
{ // 父进程
    sleep(5);   // 保证子进程先运行
    printf("I am father");

    int fd = -1;
    if((fd = open("output1.txt",O_RDWR)) == -1)
    {
        return -1;
    }
    // dup2(fd,0);    //重定向标准输入到外部文件test.txt中
    // execlp("grep", "grep", "bash", (char *)0); 
    
    char argv[3][10];
    char *envp;
    for(int j = 1; j < 3; ++j) {
        char *q = str[j];
        char *origin_q = str[j];
        int k = 0;
        for(q = str[j] ; q < str[j] + strlen(str[j]); ++q) {
            if(*q == ' ') {
                my_strncpy(argv[k], origin_q, q);
                origin_q = q + 1;
                k++;
            }

            //printf("p: %c\n", *q);
        }
        my_strncpy(argv[k], origin_q, q);
        envp = argv[0];
        printf("%s, %s\n", (char *)argv[0],  (char *)argv[1]);

        run_comand(envp, argv, 0, fd);
        dup2(fd, 0);
        execvp(argv[0], argv);
    }
}

return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值