Articles of stdio

为什么fgets()在gcc(linux)中考虑以及使用它的替代方法是什么?

可能重复: 为什么`gets'函数是危险的? 为什么不应该使用? 我要求用户input一个string使用fgets()将分析使用scanf()区分整数,浮动和字符。我想要一个可靠的程序,但我收到以下警告使用gcc: 在main': : warning: the函数中main': : warning: the gets函数是危险的,不应该被使用。 有人可以告诉我为什么这是危险的,它有什么安全的select? 如果有人能告诉我fgets致命的严重性(),这将是非常有帮助的。

如何与另一个外部程序进行通讯

我试图写入标准input并从外部程序中读取stdout(和stderr),而不更改代码。 我试过使用命名pipe道,但标准输出不显示,直到程序被终止,标准input只能在第一个input(然后cin为空)。 我已经尝试使用/ proc / [pid] / fd,但只写入和读取terminal,而不是程序。 我已经试过为此写一个字符设备文件,它工作,但一次只有一个程序(这需要一次为多个程序工作)。 在这一点上,据我所知,我可以写驱动程序,以跨越多个程序多路复用io,但我不认为这是“正确”的解决scheme。 这样做的主要目的是通过Web界面查看程序的源。 我敢肯定,要做到这一点有一定的道理。 有什么我还没有尝试过,以前做过?

stdio通信的安全

在我正在开发的一个程序(Linux)中,我需要非常简单的基于文本的IPC。 为此,使用标准input/输出pipe道将非常容易。 我可以相信发送到进程stdin的消息不能被任何人读取吗? 另外,我可以相信,如果我保持pipe道到标准输出,只有我可以读取它的输出? 我只是想确保没有基于procfs的技巧可以读取这些。

如何将程序变成deamon程序

我有时会写这样的程序来处理离线数据: load_model() //this may cost lots of time while(cin >> inputs) { result = process_input(inputs) cout << result } release_model() 这工作正常,如果我只需要处理离线数据。 但是,当数据一个接一个的时候我就陷入了困境。 由于每次都需要加载模型,这很耗时。 我想知道是否有任何方法将此程序转换成一个服务,而无需修改程序本身。 例如,我可以将cin和coutredirect到两个命名pipe道: program < namedpipe_in > namedpipe_out 我可以像这样把input放到namedpipe_in中 cat input > namedpipe_in 并在另一个pipe道中读取结果: cat namedpipe_out 但是,这个解决scheme是行不通的,因为一旦我把一些东西给了namedpipe_in,cat操作之后pipe道就会closures,程序退出。 我的问题是如何解决这个问题,使pipe道看起来更像是一个队列,而不是一个内存缓冲区。 感谢您的阅读时间。

Windowsbatch file中的输出顺序

当我执行下面的batch file @echo off echo Text from echo xcopy foobarium 我得到以下输出: File not found – foobarium 0 File(s) copied Text from echo 显然,输出的顺序是交换的。 我怎样才能确保输出按命令指定的顺序出现? (这是在Win7上)

sscanf跳过大写'N'字母

我用一个大写字母“N”得到了一个奇怪的sscanf问题(也许我不明白一些东西是正确的): 例1: char cBuff[128]; sscanf("GUIDNameNENE","%*[GUIDName]%127s" ,cBuff); 返回cBuff:ENE 例2: char cBuff[128]; sscanf("GUIDNamenENE","%*[GUIDName]%127s" ,cBuff); 返回cBuff:nENE 例3: char cBuff[128]; sscanf("GUIDNaMENE","%*[GUIDNa]%127s" ,cBuff); 返回cBuff:ENE 我已经尝试了许多其他变种,但总是跳过大写N.问题在哪里? 先谢谢你!

标准stream和vfork

我用fork / vfork函数玩了一下,有些东西让我感到困惑。 在史蒂文斯的书中写道: 请注意,在图8.3中,我们称之为_exit而不是exit。 正如我们在7.3节中所描述的,_exit不会执行任何标准I / O缓冲区的刷新。 如果我们叫退出,结果是不确定的。 根据标准I / O库的实现,我们可能会看到输出中没有任何区别,或者我们可能会发现父级printf的输出已经消失。 如果subprocess调用exit,则执行刷新标准I / Ostream。 如果这是图书馆采取的唯一行动,那么如果孩子名为_exit,我们将看到没有区别。 如果实现也closures标准I / Ostream,则表示标准输出的FILE对象的内存将被清除。 由于孩子正在借用父母的地址空间,当父母继续并调用printf时,不会显示输出,printf将返回-1。 请注意,父级的STDOUT_FILENO仍然有效,因为子级获得了父级文件描述符数组的副本(请参阅图8.2)。 大多数现代实现的退出不会麻烦closuresstream。 由于进程即将退出,内核将closures进程中打开的所有文件描述符。 在图书馆closures它们只是增加开销而没有任何好处。 所以我试图testing,如果我可以得到printf错误,在我的vfork手册有: 所有打开的stdio(3)stream都被刷新并closures。 由tmpfile(3)创build的文件被删除。 但是当我编译和执行这个程序时: #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/wait.h> int main() { int s; pid_t ret; if (vfork() == 0) { //abort(); exit(6); } else { ret=wait(&s); printf("termination status to %d\n",s); […]

我怎样才能使我的自定义shell工作与SSH?

我正在Python中为一个非常有限的用户制作一个自定义的shell,这个用户使用公钥authentication通过sshlogin。 他们需要能够运行ls , find -type d和cat在特定的目录中有一定的限制。 如果你运行类似于ssh user@server -i keyfile ,这样工作正常,因为你看到了交互式的提示,并且可以运行这些命令。 但是,类似于ssh user@server -i keyfile "ls /var/log"不是。 ssh只是挂起,没有任何反应。 通过使用-v开关,我发现连接成功,所以问题出在我的shell中。 我也相当肯定,脚本甚至没有启动,因为程序开始处的print sys.argv什么都不做。 代码如下: #!/usr/bin/env python import subprocess import re import os with open(os.devnull, 'w') as devnull: proc = lambda x: subprocess.Popen(x, stdout=subprocess.PIPE, stderr=devnull) while True: try: s = raw_input('> ') except: break try: cmd = re.split(r'\s+', […]

通过inode打开文件

是否有可能打开一个文件知道它的inode? ls -i /tmp/test/test.txt 529965 /tmp/test/test.txt 我可以提供path,inode(529965以上),我期待得到一个文件描述符。

fgets()在main()之外performance出意外

我试图在一个名为“a_function()”的函数中运行fgets()。 int a_function(){ char* str; FILE *fp; fp = fopen( "./file.txt", "r" ); if( NULL != fp ){ fgets( str, 6, fp ); printf( "%s\n", str ); }else{ printf( "cannot find file\n" ); return 1; } return 0; } int main(void){ a_function(); return 0; } 但是,这样做会导致在调用fgets()函数时发生段错误。 有趣的是,我可以逐字逐句拷贝我的代码到我的main()函数中,并且一切正常。 #include <stdio.h> #include <stdlib.h> int a_function(){ return 0; […]