C 将stdout和stderr从fork进程复制到文件
我需要将子进程的C 将stdout和stderr从fork进程复制到文件,c,linux,stdout,system-calls,C,Linux,Stdout,System Calls,我需要将子进程的stdout和stderr复制到多个文件。 我知道我可以使用tee(),但我还没有找到这样的例子。 现在,只需将所有内容打印到stdout和stderr。 怎么做 pid_t childId = fork(); switch(childId){ case -1: perror("fork() error!\n"); return; case 0: mysignal(SIGTTOU, SIG_DFL);
stdout
和stderr
复制到多个文件。我知道我可以使用
tee()
,但我还没有找到这样的例子。
现在,只需将所有内容打印到stdout和stderr。
怎么做
pid_t childId = fork();
switch(childId){
case -1:
perror("fork() error!\n");
return;
case 0:
mysignal(SIGTTOU, SIG_DFL);
mysignal(SIGTTIN, SIG_DFL);
mysignal(SIGCHLD, SIG_DFL);
if(!background)
tcsetpgrp(cterm, getpid());
setpgid(0, 0);
if (isWriter) close(pipefd[0]);
if (isReader!=-1) {
close(0);
dup(oldChannelOut);
}
if(isWriter){
close(1);
dup(pipefd[1]);
}
//exec, if program is in current directory
execv(commandArgv[0], commandArgv);
int i = 0;
char buf[_POSIX_MAX_PATH];
while(path[i] != NULL){
buf[0] = '\0';
strcat(buf, path[i]);
if(path[i][ strlen(path[i])-1 ] != '/'){
buf[strlen(path[i])] = '/';
buf[strlen(path[i])+1] = '\0';
}
strcat(buf, commandArgv[0]);
execv(buf, commandArgv);
++i;
}
fprintf(stderr,"\"%s\": command not found\n",commandArgv[0]);
exit(1);
UPD:尝试修改后,不工作。问题在哪里
fdout=open("1", O_APPEND | O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
fderr=open("2",O_APPEND | O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
...
case 0:
if (isReader!=-1) {
close(0);
dup(oldChannelOut);
}
dup2(fdout, 1);
dup2(fderr, 2);
close(fdout);
close(fderr);
exec....
default:
{
if(background) {
addJob(&jobListStartB,childId,commandArgv,BACKGROUND);
if (oldChannelOut != -1){
close(oldChannelOut);
oldChannelOut = -1;
}
}
else if(!background){
if (oldChannelOut != -1){
close(oldChannelOut);
oldChannelOut = -1;
}
}
使用
tee
和splice
将数据从一个句柄写入多个其他句柄:
// Needs at least two targets, sentinel is INVALID_HANDLE_VALUE
int push_to_all(int source, ssize_t count, ...) {
va_list vl;
va_start(vl, count);
int target = va_arg(vl, int), next = va_arg(vl, int);
count = tee(source, target, count, SPLICE_F_NONBLOCK);
if(count <= 0) { va_end(vl); return count; }
while((target = next, next = va_arg(vl, int)) > 0) {
tee(source, target, count, 0);
va_end(vl);
return splice(source, 0, target, 0, count, 0);
}
//至少需要两个目标,sentinel是无效的\u句柄\u值
int push_to_all(int源、ssize_t计数,…){
va_列表vl;
va_启动(vl,计数);
int target=va_arg(vl,int),next=va_arg(vl,int);
计数=T形三通(源、目标、计数、拼接非块);
如果(计数0){
tee(源、目标、计数,0);
va_端(vl);
返回拼接(源、0、目标、0、计数、0);
}
所以,分叉进程的stdout和stderr应该写入stdout和stderr,以及两个文件,对吗?它们必须复制到两个文件,而不仅仅是写入。这是什么意思?stderr/stdout到文件和stderr/stdout这是一个从管道读取到子进程并将数据写入任意数量的ot的函数她的把手。