Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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 检查程序是否正在通过管道传输_C_Git_Pipe - Fatal编程技术网

C 检查程序是否正在通过管道传输

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命令,但不太可能有任何不受信任的用户进入我的系统 我的问题:我如何判断标准输出是否正在写入文件

我正在编写一个程序来加速git push操作。它需要做的是:

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,则标准输出将被重定向或管道传输

或者,使用as
fstat(STDOUT\u FILENO和stdoutstat)

但是你应该在你的系统上正确地设置
ssh
(有凭证,任何ssh教程都可以使用STFW!),以避免
git
询问任何密码。

你可以通过使用(在Linux和POSIX上!)这个函数来检测stdout何时是终端,可能是
isatty(stdout\u FILENO)

因此,您可以猜测,如果
isatty(STDOUT\u FILENO)
为false,则标准输出将被重定向或管道传输

或者,使用as
fstat(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
使这成为一个坏主意。