c程序编译的步骤
摘自 CSAPP
摘自 CSAPP
无干货,纯示例。 #include <fcntl.h> #include <stdio.h> int main(){ //先试着打开一个不存在的文件 char* filepath = "/home/kent/temp/test-file-io.txt"; int fd = open(filepath, O_RDWR); printf("The File Descriptor of an non-existing files is %d \n", fd); if(fd == -1){ perror(filepath); } //创建文件 fd = open(filepath, O_CREAT|O_RDWR, 0777); printf("The new created File Descriptor is %d \n", fd); //当前偏移量 int pos = lseek(fd, 0, SEEK_CUR); …
代码:模仿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 …
exec()会替换进程中的哪些东西? 1. text段 2. 数据段 3. 堆 4. 栈 原来的文件描述符是否会被关闭? 这取决于文件描述符是否有设置了close-on-exec标志。如果设置了,在exec时就会关闭。默认情况下没有这个设置,因此exec时默认不会关闭原来的文件描述符。
如果一个线程处于detached状态,则当它执行结束时,操作系统会自动回收它占用的资源。 如果一个线程不是detached,则它占用的资源必须由另一个线程通过pthread_join()来回收。
#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"); } …
UNIX进程和文件中间通过文件表来关联 v结点代表真正的文件元数据(linux只有i结点,但作用差不多) 每个进程都搞一个文件表可以使得: 对同一个文件,每个文件描述符可以有自己的偏移量和打开状态(如只读、只写),比如 这些知识对正确地并发操作文件会有帮助。 另外,两个文件描述符也可以指向同一个文件表项,比如刚刚fork()出的子进程和父进程会共享同一个文件表项。
早期的UNIX系统是通过TeleTYpewriter(简称tty)来登录的;所以终端就是tty. 这个习惯被沿袭下来,所以现在仍用tty来称呼各种终端,包括硬终端,shell窗口等。 其中shell窗口终端在UNIX眼里实际上是仿真的字符设备。
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;
IA32(x86)是一个系列,那么gcc在编译32位程序时采用的体系结构是哪其中的哪一个呢? 答案:默认采用i386. 不过你可以指定参数,让它为特定的体系结构生成机器代码。