Linux/Unix/Windows

unix代码示例:一个socket客户端程序

代码:模仿telnet访问newsmth bbs,打印第一次收到的应答后即退出。 #include <stdio.h> #include <unistd.h> #include <netdb.h> #include <errno.h> #include <sys/socket.h> #include <string.h> #define MAXADDRLEN 256 #define BUFLEN 500 void print_resp(int sockfd) { printf("ready to print response\n"); char buf[BUFLEN]; int n; int i; for(i = 0; i < 5; i ++){ n = recv(sockfd, buf, BUFLEN, 0); write(STDOUT_FILENO, buf, n); } } int main(int …

unix代码示例:一个socket客户端程序 Read More »

unix进程与被打开文件的关联

UNIX进程和文件中间通过文件表来关联 v结点代表真正的文件元数据(linux只有i结点,但作用差不多) 每个进程都搞一个文件表可以使得: 对同一个文件,每个文件描述符可以有自己的偏移量和打开状态(如只读、只写),比如 这些知识对正确地并发操作文件会有帮助。 另外,两个文件描述符也可以指向同一个文件表项,比如刚刚fork()出的子进程和父进程会共享同一个文件表项。

代码示例:linux多线程

#include <stdio.h> #include <pthread.h> #include <sys/syscall.h> int gettid(){ return syscall(SYS_gettid); } void print_pid_tid(){ printf("Current pid is %u and current tid(lwp_id) is %u\n", (unsigned int)getpid(), (unsigned int)gettid()); } void * thread_func(){ printf("Created thread: "); print_pid_tid(); } int main(){ pthread_t thread; int err = pthread_create(&thread, NULL, thread_func, NULL); //第3个参数是一个函数,相当于java Runnable类里的run方法 if(err != 0){ perror("Cannot create thread"); } …

代码示例:linux多线程 Read More »

linux线程被杀死会牵连其他线程吗

问:  linux轻量级线程被杀死会牵连其他线程吗 ? 答案:如果这里的杀死是指kill -9的话,则会杀死整个进程,自然也会终结同一个进程内的所有线程。linux的线程是用轻量级进程(lwp, lightweight process)实现的,同一个进程内的所有轻量级进程有共同的PID和不同的LWP-ID. 即使你只kill -9 某个LWP-ID,会导致整个进程被杀死。 引用 POSIX-compliant multithreaded applications are best handled by kernels that support "thread groups ." In Linux a thread group is basically a set of lightweight processes that implement a multithreaded application and act as a whole with regards to some system calls such as getpid( …

linux线程被杀死会牵连其他线程吗 Read More »

在ubuntu上用gdb调试printf源码

ubuntu中默认情况下库函数是不带调试信息的,所以用gdb无法进入到printf()函数里。 解决办法是: 1.安装带有调试信息的libc: sudo apt-get install libc6-dbg 2.下载libc源码     a.选定一个放置源码的目录并进入,如 /home/kent/dev-os/libc6-source     b.执行sudo apt-get source libc6, 会把源码下载到当前目录中。 最后源码目录大概是:/home/kent/dev-os/libc6-source/eglibc-2.15 3.运行gdb时指定libc源码目录:gdb `find /home/kent/dev-os/libc6-source/eglibc-2.15 -type d -printf ‘-d %p ‘`  my_program 4.最后进入printf()函数即可. 我这里看到的第一行代码是 va_list arg;

为什么终端会被称作tty?

早期的UNIX系统是通过TeleTYpewriter(简称tty)来登录的;所以终端就是tty. 这个习惯被沿袭下来,所以现在仍用tty来称呼各种终端,包括硬终端,shell窗口等。 其中shell窗口终端在UNIX眼里实际上是仿真的字符设备。

linux的init进程

1. 内核在系统启动的最后阶段启动init进程 2. init进程则读取initscript并执行相关程序,以完成系统启动的整个过程 3. init进程的PID为1, 其他所有进程都是这个进程的后代