Tag: linux

为什么scanf()在这段代码中造成无限循环?

我有一个小型的C程序,它只是从stdin中读取数字,每个循环都有一个数字。 如果用户input一些NaN,应该在控制台上输出一个错误,input提示应该再次返回。 input“0”时,循环结束,给定的正/负值的数量应打印到控制台。 这是该计划: #include <stdio.h> int main() { int number, p = 0, n = 0; while (1) { printf("-> "); if (scanf("%d", &number) == 0) { printf("Err…\n"); continue; } if (number > 0) p++; else if (number < 0) n++; else break; /* 0 given */ } printf("Read %d positive and %d negative […]

在i386和x86-64上,UNIX和Linux系统调用的调用约定是什么?

以下链接解释了UNIX(BSD flavor)和Linux的x86-32系统调用约定: http://www.int80h.org/bsdasm/#system-calls http://www.freebsd.org/doc/en/books/developers-handbook/x86-system-calls.html 但是,UNIX和Linux上的x86-64系统调用约定是什么?

套接字选项SO_REUSEADDR和SO_REUSEPORT,它们有什么不同? 他们在所有主要的操作系统中都是一样的吗?

套接字选项SO_REUSEADDR和SO_REUSEPORT的man pages和程序员文档对于不同的操作系统是不同的,并且通常非常混乱。 有些操作系统甚至没有SO_REUSEPORT选项。 WEB充斥着关于这个主题的矛盾信息,通常你可以find一些特定操作系统的一个socket实现的信息,这些信息甚至可能在文中都没有明确提到。 那么SO_REUSEADDR与SO_REUSEPORT什么不同呢? 没有SO_REUSEPORT系统更受限制吗? 如果我在不同的操作系统上使用其中一种,预期的行为究竟是什么?

为什么“cd”不能在bash shell脚本中工作?

我正在尝试编写一个小脚本来将当前目录更改为我的项目目录: #!/bin/bash cd /home/tree/projects/java 我将这个文件保存为proj,使用chmod添加执行权限,并将其复制到/usr/bin 。 当我通过proj调用它时,它什么都不做。 我究竟做错了什么?

什么是LD_PRELOAD技巧?

我最近在proggit上遇到了一个引用,并且(现在)没有解释。 我怀疑这可能是,但我不知道。

如何避免在信号处理程序中使用printf?

由于printf不是可重入的,因此在信号处理程序中使用它不是安全的。 但是我已经看到很多使用printf的示例代码。 所以我的问题是:什么时候我们需要避免在信号处理程序中使用printf ,是否有推荐的replace?

printfexception后“fork()”

操作系统:Linux,语言:纯粹的C 一般情况下,我正在学习C编程,而在UNIX下C编程则是一个特例。 在使用fork()调用之后,我检测到printf()函数的一个奇怪的(对我来说)行为。 码 #include <stdio.h> #include <system.h> int main() { int pid; printf( "Hello, my pid is %d", getpid() ); pid = fork(); if( pid == 0 ) { printf( "\nI was forked! :D" ); sleep( 3 ); } else { waitpid( pid, NULL, 0 ); printf( "\n%d was forked!", pid ); } return […]

单个主机上有多个glibc库

单个主机上有多个glibc库 我的linux(SLES-8)服务器目前有glibc-2.2.5-235,但是我有一个程序不能在这个版本上运行,需要glibc-2.3.3。 是否有可能在同一主机上安装多个glibcs​​? 这是我在旧的glibc上运行我的程序时得到的错误: ./myapp: /lib/i686/libc.so.6: version `GLIBC_2.3' not found (required by ./myapp) ./myapp: /lib/i686/libpthread.so.0: version `GLIBC_2.3.2' not found (required by ./myapp) ./myapp: /lib/i686/libc.so.6: version `GLIBC_2.3' not found (required by ./libxerces-c.so.27) ./myapp: /lib/ld-linux.so.2: version `GLIBC_2.3' not found (required by ./libstdc++.so.6) ./myapp: /lib/i686/libc.so.6: version `GLIBC_2.3' not found (required by ./libstdc++.so.6) 于是我创build了一个名为newglibc的新目录,并将以下文件复制到: libpthread.so.0 libm.so.6 libc.so.6 ld-2.3.3.so ld-linux.so.2 […]

面对一个错误“*** glibc检测***免费():无效的下一个大小(快)”

请参阅MSO问题可能出现的重复列表 – C内存分配和溢出边界以获取有关密切相关问题的信息。 开发环境:CentOS 4.7,Kdevelop 3.1.1,gcc 3.4.6 我运行一个Javatesting客户端,使用JNI加载一个C ++共享库。 我的应用程序中有三个组件, Java客户端 C ++共享库,它充当一个JNI包装器。 (我会称之为“wrapperlibrary”) 包含业务对象的C ++共享库。 (我会称之为“businesslibrary”) 当我运行客户端时,我经常面对一个错误, *** glibc detected *** free(): invalid next size (fast): 0x080eeef8 *** 。 这个错误大约需要10到11次,然后运行应用程序。 在我的Java客户端中,我首先按如下方式在静态ctor中加载所需的C ++库, static { System.Load("/root/Desktop/libs/businesslibrary"); System.out.println("business library loaded"); System.Load("/root/Desktop/libs/wrapperlibrary"); System.out.println("wrapper library loaded"); } “业务库加载”的语句被打印在控制台上,但之后错误*** glibc…来。 在包装库的项目设置中,业务库被指定为从属库。 所以,即使我省略了加载businesslibrary的调用, static { System.Load("/root/Desktop/libs/wrapperlibrary"); System.out.println("wrapper library loaded"); } […]

如何终止用shell = True启动的pythonsubprocess

我使用以下命令启动subprocess: p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) 但是,当我试图杀死使用: p.terminate() 要么 p.kill() 该命令一直在后台运行,所以我想知道如何才能真正终止进程。 请注意,当我运行命令: p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) 发出p.terminate()时,它终止成功。