C 检查程序是否正在通过管道传输
我正在编写一个程序来加速git push操作。它需要做的是:C 检查程序是否正在通过管道传输,c,git,pipe,C,Git,Pipe,我正在编写一个程序来加速git push操作。它需要做的是: printf("[github-username]\n[github-password]"); 然后我会这样使用它: git-autologin | git push 但我不希望有人简单地键入git autologin或git autologin>file.txt就能看到我的用户名和密码。我知道这听起来很傻,因为任何人都可以自动执行git命令,但不太可能有任何不受信任的用户进入我的系统 我的问题:我如何判断标准输出是否正在写入文件
printf("[github-username]\n[github-password]");
然后我会这样使用它:
git-autologin | git push
但我不希望有人简单地键入git autologin
或git autologin>file.txt
就能看到我的用户名和密码。我知道这听起来很傻,因为任何人都可以自动执行git命令,但不太可能有任何不受信任的用户进入我的系统
我的问题:我如何判断标准输出是否正在写入文件/终端或是否正在通过管道传输?Edit:git push管道只是一个想法,而不是我问的唯一原因。
编辑:有没有办法确定PID或有关它被管道传输到的进程的更多信息?您可以使用(Linux和POSIX上!)函数检测stdout何时是终端,可能是
isatty(stdout\u FILENO)
因此,您可以猜测,如果isatty(STDOUT\u FILENO)
为false,则标准输出将被重定向或管道传输
或者,使用asfstat(STDOUT\u FILENO和stdoutstat)代码>
但是你应该在你的系统上正确地设置ssh
(有凭证,任何ssh教程都可以使用STFW!),以避免git
询问任何密码。你可以通过使用(在Linux和POSIX上!)这个函数来检测stdout何时是终端,可能是isatty(stdout\u FILENO)
因此,您可以猜测,如果isatty(STDOUT\u FILENO)
为false,则标准输出将被重定向或管道传输
或者,使用asfstat(STDOUT\u FILENO和stdoutstat)代码>
但是您应该在系统上正确设置ssh
(使用凭据,任何ssh教程都可以使用STFW!),以避免git
询问任何密码。对于这个特定的解决方案,您可能需要仔细阅读。实际上,您最好只使用ssh密钥进行身份验证,而不是用户名/密码。不是完全重复的,因为它是shell而不是C,但我认为它提供了一般性的答案(也就是说,你不能真正做你想做的事情)。git autologin | cat
。现在,你不能在管道或终端上寻找;你可以在文件上进行编辑。您可以通过查看输出文件描述符上的类型信息(stat()
和S_ISCHR
宏,或者检查S_ISREG
)来判断设备是否为终端;如果它看起来像一个常规文件(S_ISREG
),但您无法在其上查找(errno==ESPIPE
),则它可能是一个管道。但是,您无法很容易地判断接收端上的命令是否为cat
。字面上的答案是isatty
函数(这是libc内部用于选择stdout缓冲的函数),但如前所述,git autologin | cat
使这成为一个坏主意。对于这个特定的解决方案,您可能需要仔细阅读。实际上,您最好只使用ssh密钥进行身份验证,而不是用户名/密码。不是完全重复的,因为它是shell而不是C,但我认为它提供了一般性的答案(也就是说,你不能真正做你想做的事情)。git autologin | cat
。现在,你不能在管道或终端上寻找;你可以在文件上进行编辑。您可以通过查看输出文件描述符上的类型信息(stat()
和S_ISCHR
宏,或者检查S_ISREG
)来判断设备是否为终端;如果它看起来像一个常规文件(S_ISREG
),但您无法在其上查找(errno==ESPIPE
),则它可能是一个管道。但是,您无法很容易地判断接收端的命令是否为cat
。字面上的答案是isatty
函数(这是libc内部用于选择标准输出缓冲的函数),但正如前面所指出的,git autologin | cat
使这成为一个坏主意。