大佬教程收集整理的这篇文章主要介绍了C – 从父母分娩后重定向stdout,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
目前我已经使用execvp()分叉并执行了外部程序.
然后从分叉之前创建的线程重定向stdout,因为分叉进程将继承父文件描述符表,允许我在foking之后重定向.
但是,我最初可以将stdout重定向到所需的文件,父母和孩子的stdouts都被重定向.但是,如果我尝试将其重定向到另一个文件,则只重定向父项stdout,子项的stdout保持不变.
struct params { const char *p; int fd; int wait; }; #define EXIT_NOEXEC 126 #define EXIT_NOTFOUND 127 #define EXIT_MISC 127 static void dofile(struct params* st); void dupit(const char *p,struct params* st); void* reload_config(void* para); int main(int argc,char *argv[]) { int exit_status,prog_status; struct params init; pid_t prog_pid; dofile(&init); prog_pid = fork(); if (prog_pid == 0) { execvp(*argv,argv); exit_status = (errno == ENOENT) ? EXIT_NOTFOUND : EXIT_NOEXEc; err(exit_status,"%s",argv[0]); exit(EXIT_FAILURE); } else { while (wait(&prog_status) != prog_pid); return prog_status; } } static void dofile(struct params* st) { const char *p p = out.txt; dupit(p,st); } void dupit(const char *p,struct params* st) { pthread_t tid; st->wait = 0; int err = pthread_create(&(tid),NULL,&reload_config,st); if (err != 0) { printf("\ncan't create thread :[%s]",strerror(err)); exit(1); } else { while (st->wait == 0) { sleep(1) } } } void* reload_config(void* para) { struct params *passed = (struct params *) para; int pre_config = 3; int cur_config = 1; int saved_stdout = dup(STDOUT_FILENO); char infile[5]; int devNull = open("/dev/null",O_WRONLY); int file = open("out.txt",O_WRONLY); FILE *config; config = fopen("config.txt","r"); if (access("config.txt",F_OK) != -1) { while (1) { fgets(infile,5,config); fclose(config); cur_config = infile[0] - '0'; printf("output from thread,current config = %d\n",cur_config); if (pre_config != cur_config) { if (cur_config == 1) { if (dup2(file,STDOUT_FILENO) == -1) { err(EXIT_MISC,null); } } else { dup2(devNull,STDOUT_FILENO); } pre_config = cur_config; } if (passed->wait==0) { passed->wait = 1; } sleep(1); } } else { if (dup2(passed->fd,STDOUT_FILENO) == -1) { err(EXIT_MISC,null); } } }
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <String.h> #include <stdlib.h> #include <errno.h> int main(int argc,char **argv) { pid_t pid; const char *file1 = "file1.txt"; const char *file2 = "file2.txt"; int pipefd[2]; int fd; int rval; fd = open(file1,O_WRONLY|O_CREAT|O_TRUNC,S_IRWXU); if (fd == -1) { perror("file1 open"); exit(-1); } /* * This pipe will be used by parent process to tell child which file * to redirect to. */ rval = pipe2(pipefd,O_NONBLOCK); if (fd == -1) { perror("pipe"); exit(-1); } /* Redirect stdout to the file opened before the fork. */ dup2(fd,STDOUT_FILENO); pid = fork(); if (pid == -1) { perror("fork"); exit(-1); } else if (pid == 0) { /* Child process. */ int ix; char redirect_file[100]; close(pipefd[1]); for (ix = 0; ix < 10; ix++) { printf("%d\n",iX); sleep(1); rval = read(pipefd[0],redirect_file,sizeof(redirect_filE)); if (rval > 0) { /* * Parent process has written a filename to the pipe. */ fd = open(redirect_file,S_IRWXU); if (fd == -1) { perror("file2 open"); exit(-1); } /* Ensure prevIoUs output has been written to current file. */ fflush(stdout); /* Change redirect Now. */ dup2(fd,STDOUT_FILENO); } } } else { /* Parent process. */ close(pipefd[0]); /* Wait a little and then tell child to change redirect file. */ sleep(5); write(pipefd[1],file2,strlen(file2) + 1); wait(); } }
如果运行此程序,您会发现子输出的一半转到file1(第一次重定向),另一半输出转到file2(第二次重定向).
$cat file1.txt 0 1 2 3 4 $cat file2.txt 5 6 7 8 9
最后一点说明.示例程序在fork之前执行第一个dup.我是这样做的,因为这是你的代码的显示方式,也是为了强调问题的前后方面.但在实际代码中,传统的做法是首先执行fork,然后执行dup,最后执行exec.在fork之后完成dup,这样只有子进程受到影响而不是父进程(除非那真的是你想要的).
以上是大佬教程为你收集整理的C – 从父母分娩后重定向stdout全部内容,希望文章能够帮你解决C – 从父母分娩后重定向stdout所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。