Tag: linux

C – fork和printf行为

与printf一起测试fork函数我发现了一些奇怪的行为 例如,代码: int main(){ if(fork()==0){ printf(“TestString”); } } 不打印任何东西,而 int main(){ if(fork()==0) { printf(“TestString\n”); } } 正确打印出TestString。 为什么打印新行会改变行为? 我怀疑它可能与fflush()有关,但我不确定。 我可以获得解释或链接,我可以阅读它吗? 提前谢谢你的回答。 编辑:我正在寻找的解释是什么实际上是冲洗,为什么和冲洗相同。

如何从子进程为父进程设置环境变量?

如何从子进程为父进程设置环境变量? 例如:我有PARENT和CHILD流程。 CHILD进程inheritance自PARENT进程环境变量,名为TMP_VARIABLE = 777。 如何将CHILD过程中TMP_VARIABLE的值更改为999它的值对于PARENT进程可见为TMP_VARIABLE = 999?

如何判断程序是在x86 / x64还是ARM Linux平台上运行

在c程序中,我想做不同的事情。 该程序将在基于x86 / x64的GNU / Linux系统以及基于ARM的系统(例如PC或RaspberryPI)上运行。 GCC中是否有预定义的宏来告诉平台? 就像是 #ifdef _X64_ /do x64 stuff #elif _ARM_ //do arm stuff #endif 或者这可能是错误的做法? 我将使用Makefile进行编译,我可以使用自己的定义。 什么是最好/最安全的方法?

C局部变量重用

据我所知,每次调用函数后都会丢弃局部变量。 但是当我执行这段代码时,变量保留了它们之前的值。 这是什么行为? 编译器:gcc 4.8.4 #include void t(); int main(void){ t(); t(); t(); return 0; } void t(){ int i; i++; printf(“%d\n”,i); } 输出: 4bh1@mybox:~/C-fi$ ./test 1 2 3

信号处理程序中的pthread_exit()

(这个问题可能与信号处理程序中的pthread_exit有些相关导致分段错误 )我正在编写一个引导锁定防止库,其中总是有一个检查线程正在执行图形内容并检查是否存在死锁,如果有,则它会发出其中一个信号冲突的线程。 当该线程捕获信号时,它释放它拥有并退出的所有互斥锁。 有多个资源互斥(显然)和一个关键区域互斥,所有获取,释放资源锁定和执行图形计算的调用必须首先获得此锁定。 现在出现了问题。 使用2个竞争(不计入检查线程)线程, 有时程序在一个线程被杀死后死锁。 在gdb中,它说死线程拥有关键区域锁定但从未释放它。 在信号处理程序中添加断点并单步执行后, 在pthread_exit()之前看起来锁属于其他人(正如预期的那样),但是在pthread_exit()之后,所有权神奇地转到了这个线程。 我能想到的唯一猜测是,当试图获得关键区域锁定时,被杀死的线程在pthread_mutex_lock处阻塞(因为它需要另一个资源互斥锁),然后信号来了,中断了pthread_mutex_lock。 由于这个电话不是信号防范的,所以发生了一些奇怪的事情? 就像信号处理程序可能已经返回并且该线程获得锁定然后退出? Idk ..感谢任何见解!

Execv Linux printf不起作用

我正在尝试使用此c代码运行可执行文件: int main(int argc, char *argv[]) { printf(“hello.\n”); sleep(2); if (execlp(“ls”,”ls”,”-l”,NULL) == -1) printf(“Error occured during execute ls.\n”); return 0; } 为什么printf(“你好\ n”)不起作用? 即使我睡觉了?

Linux,C,epoll(),read()数据未完成?

Linux,C。下面的问题只发生在使用epoll()。 如果我在服务器套接字上使用select(),则不会丢失数据。 ============================= 更新:我在read()中收到了errno = 11(再试一次)。 我需要继续,还是打破while循环? ============================= 我有客户端,10次发送1280 K数据(每次发送128K数据); 我有服务器端,使用epoll()来监视传入的数据。 收到通知后,我使用下面的代码来读取数据: nbytes = Nread(current_fd, buffer, bytes_to_be_read); int Nread(int fd, char *buffer, size_t count) { ssize_t r; size_t left = count; printf(“===>\n”); while (left > 0){ r = read(fd, buffer, left); printf(“data: %ld\n”, r); if (r done, %ld\n”, total – left); return count – left; […]

gcc如何自动知道包含glib库

我在C中使用glib.h编写简单的程序,但是当我编译它时,我得到一个错误: $ gcc test.c -o test test.c:3:18: fatal error: glib.h: No such file or directory compilation terminated. 所以从上面看来gcc找不到glib.h文件(这是libglib2.0-dev软件包的一部分并且已经安装了它)。 所以首先我尝试在我的系统中找到glib.h文件并找到如下输出: $ locate glib.h /usr/src/linux-headers-3.2.0-29-generic-pae/include/config/blk/dev/bsglib.h /usr/src/linux-headers-3.2.0-48-generic-pae/include/config/blk/dev/bsglib.h /usr/src/linux-headers-3.2.0-57-generic-pae/include/config/blk/dev/bsglib.h 然后我尝试了命令: $ pkg-config –cflags glib-2.0 -I/usr/include/glib-2.0 -I/usr/lib/i386-linux-gnu/glib-2.0/include 为GCC获得正确的标志,但它仍然显示相同的错误。 所以试着从SO中找到解决方案并找到精确的解决方案 $ gcc test.c -Wall -o test `pkg-config –cflags –libs glib-2.0` 这个命令解决了我的问题 但我有疑问,是不是有任何方法可以告诉gcc包含glib库所以不需要在gcc之后给出标志pkg-config –cflags –libs glib-2.0并简单地通过gcc test.c -o test编译我的文件?

‘_attribute _((aligned(4)))的含义是什么? 在第一行?

char buf[BUF_LEN]_attribute_((aligned(4))); ssize_t len, i = 0; /* read BUF_LEN bytes’ worth of events */ len = read (fd, buf, BUF_LEN); /* loop over every read event until none remain */ while (i wd, event->mask, event->cookie, event->len, (event->mask & IN_ISDIR) ? “yes” : “no”); /* if there is a name, print it */ if (event->len) […]

手动指定特定链接符号的重新映射

如果不修改这两个源文件,有没有办法通过编译它们来获取生成的目标文件,并说服链接器将main_v1.c中的foo链接到bar.c中的bar ? main_v1.c void foo(void); int main(void) { foo(); } bar.c #include void bar(void) { puts(“bar()!”); } 修改目标文件本身是公平的游戏,但假设我们甚至可能没有可用的源代码。 该平台是Linux。 通过坚持对main_v1.c的适度更改,并链接到一个额外的“映射”对象文件,这里几乎可以用标准C获得所需的结果。 main_v2.c extern void (*const foo)(void); int main(void) { foo(); } bar.c没有变化。 map.c void bar(void); void (*const foo)(void) = bar; 如果使用lto编译目标文件,则甚至可以省略函数指针取消引用(使用最近的gcc)。 这是一个非常好的结果但是如果修改main()以直接调用bar() ,那么bar()本身在链接后内联,因此还有改进的余地。