Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在子进程中不允许printf_C_Linux - Fatal编程技术网

C 在子进程中不允许printf

C 在子进程中不允许printf,c,linux,C,Linux,我在Linux下的C中有一个cmd行应用程序,它必须运行另一个进程,问题是子进程在comand行中打印了很多内容,整个应用程序变得混乱 是否可以禁止子进程从父进程打印cmd行中的任何内容?例如,如果能够定义一个允许或不允许子进程打印的命令,这将非常有帮助。有一个由来已久的传统,即只将输出重定向到位桶(a),大致如下: system("runChild >/dev/null 2>&1"); 或者,如果通过fork/exec执行,只需在fork和exec之间使用dup2重定向文

我在Linux下的C中有一个cmd行应用程序,它必须运行另一个进程,问题是子进程在comand行中打印了很多内容,整个应用程序变得混乱


是否可以禁止子进程从父进程打印cmd行中的任何内容?例如,如果能够定义一个允许或不允许子进程打印的命令,这将非常有帮助。

有一个由来已久的传统,即只将输出重定向到位桶(a),大致如下:

system("runChild >/dev/null 2>&1");
或者,如果通过
fork/exec
执行,只需在
fork
exec
之间使用
dup2
重定向文件句柄即可

它不会阻止一个有决心的孩子输出到你的标准输出,但要做到这一点必须非常棘手



(a) 我通常不太喜欢这个,以防万一出了问题。我更愿意将它重定向到一个真实的文件,如果需要,可以稍后检查(如果不需要,则最终删除)。

可以通过完全取消printf并使用一个只有在父进程调用它时才会打印的函数来解决

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void print(char *msg,int dadid) {
    if(dadid!=getpid()){
        printf(msg);
    }
}

int main(){
    int dadid=getpid();
    int son = fork();

//code
//code

print("huhuhu",dadid);
return 0;
}
#包括
#包括
#包括
#包括
无效打印(字符*消息,int-dadid){
如果(dadid!=getpid()){
printf(msg);
}
}
int main(){
int dadid=getpid();
int-son=fork();
//代码
//代码
印刷品(“呼呼”,dadid);
返回0;
}
也可以在前面提到的支票中包含您的打印信息。

请阅读

在最近的Linux上,每个都是以格式(除了
init
systemd
;play with or)运行的,以(或…)和启动

您可以巧妙地使用with将STDOUT\u FILENO重定向到
/dev/null
(请参阅)

我在Linux下的C中有一个cmd行应用程序,它必须运行另一个进程,问题是子进程在comand行中打印了很多内容

相反,我将提供一种有选择地重定向子进程输出的方法。您可以使用或环境变量(请参阅和/或)为用户提供这样的选项

这种命令程序启动和重定向子进程并重定向它们的一个例子是您的编译器(请参阅;它运行
cc1
和…)。考虑下载和学习它的源代码。
同时也要学习一些(例如)的源代码,或者编写自己的源代码。

关闭child的stdout。@KamilCuk重定向到/dev/null可能是个更好的主意。
print(String msg,
不会编译。add#include Sure.。C中没有
String
这样的东西。你可以
取消打印(const char*msg,int dadid)
。另外,
printf(msg)
是一个安全问题,请始终使用
printf(“%s”,msg)
。当然,这是一个选项,只有在能够修改子项的情况下才能使用。它需要进行广泛的修改。并且结果不再独立工作。我倾向于说,有更简单、更好的替代方案。