<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>My Crusade &#187; strace</title>
	<atom:link href="http://www.jarodwang.cn/tag/strace/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jarodwang.cn</link>
	<description>For the future we believe in.</description>
	<lastBuildDate>Tue, 07 Sep 2010 05:42:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>A sample program for stat()</title>
		<link>http://www.jarodwang.cn/2008/12/11/a-sample-program-for-stat/</link>
		<comments>http://www.jarodwang.cn/2008/12/11/a-sample-program-for-stat/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 15:23:09 +0000</pubDate>
		<dc:creator>jarodwang</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[stat]]></category>
		<category><![CDATA[strace]]></category>

		<guid isPermaLink="false">http://www.jarodwang.cn/?p=180</guid>
		<description><![CDATA[stat() is a Unix system call that returns useful data about a file inode. 今天在看一个 strace 的输出时，看到下面的一行： 19:42:00.545797 stat64(&#8220;/cdctest/orahome&#8221;, {st_mode=S_IFDIR&#124;0755, st_size=8192, &#8230;}) = 0 Google 之后发现 stat64 背后就是 stat() 系统调用，这里有详细的介绍。 于是一时手痒，想自己写一个简单的程序来实验一下，就在自己的 PC 机（跑的是 Debian &#8220;etch&#8221; 4.0r5）上动手。 首先是搭建编译环境： # apt-get install gcc build-essential 然后coding如下： #include #include #include #include #include int main() { struct stat *buf; const [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><a title="stat()" href="http://en.wikipedia.org/wiki/Stat_(Unix)" target="_blank">stat()</a> is a Unix system call that returns useful data about a file inode.</p></blockquote>
<p>今天在看一个 strace 的输出时，看到下面的一行：</p>
<p>19:42:00.545797 stat64(&#8220;/cdctest/orahome&#8221;, {st_mode=S_IFDIR|0755, st_size=8192, &#8230;}) = 0</p>
<p>Google 之后发现 stat64 背后就是 stat() 系统调用，<a title="这里" href="http://linux.die.net/man/2/stat64" target="_blank">这里</a>有详细的介绍。</p>
<p>于是一时手痒，想自己写一个简单的程序来实验一下，就在自己的 PC 机（跑的是 Debian &#8220;etch&#8221; 4.0r5）上动手。</p>
<p>首先是搭建编译环境：</p>
<p># apt-get install gcc build-essential</p>
<p>然后coding如下：</p>
<pre lang="C" line="1" file="test_stat.c" colla="+">
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>

int main()
{
	struct stat *buf;
	const char *path = "/home/ftp/upload";

	buf = (struct stat *) malloc(sizeof(struct stat));
	memset(buf, 0, sizeof(struct stat));

	int ret; 

	ret = stat("/home/ftp/upload", buf);

	if (ret == EACCES)
	{
		printf("EACCES\n");
		free(buf);
		buf = NULL;
		exit(-EACCES);
	}

	printf("%d\n", buf->st_mode);

	if (S_ISDIR(buf->st_mode))
	{
		printf("%s is a diretory.\n", path);
	}
	else
		printf("%s is NOT a directory.\n", path);

	free(buf);
	buf=NULL;

	return 0;
}
</pre>
<p>编译生成可执行文件</p>
<p>jarod@zhenwan:~$ gcc -o test_stat test_stat.c</p>
<p>运行之：</p>
<p>jarod@zhenwan:~$ ./test_stat<br />
16895<br />
/home/ftp/upload is a diretory.</p>
<p>大功告成。</p>
<p>最后还可以自己 strace 一把：</p>
<p><span id="more-180"></span></p>
<p>jarod@zhenwan:~$ strace ./test_stat<br />
execve(&#8220;./test_stat&#8221;, ["./test_stat"], [/* 27 vars */]) = 0<br />
uname({sys=&#8221;Linux&#8221;, node=&#8221;zhenwan&#8221;, &#8230;}) = 0<br />
brk(0)                                  = 0x804a000<br />
access(&#8220;/etc/ld.so.nohwcap&#8221;, F_OK)      = -1 ENOENT (No such file or directory)<br />
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7ee9000<br />
access(&#8220;/etc/ld.so.preload&#8221;, R_OK)      = -1 ENOENT (No such file or directory)<br />
open(&#8220;/etc/ld.so.cache&#8221;, O_RDONLY)      = 3<br />
fstat64(3, {st_mode=S_IFREG|0644, st_size=45513, &#8230;}) = 0<br />
mmap2(NULL, 45513, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7edd000<br />
close(3)                                = 0<br />
access(&#8220;/etc/ld.so.nohwcap&#8221;, F_OK)      = -1 ENOENT (No such file or directory)<br />
open(&#8220;/lib/tls/i686/cmov/libc.so.6&#8243;, O_RDONLY) = 3<br />
read(3, &#8220;\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240O\1&#8243;&#8230;, 512) = 512<br />
fstat64(3, {st_mode=S_IFREG|0644, st_size=1241392, &#8230;}) = 0<br />
mmap2(NULL, 1247388, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7dac000<br />
mmap2(0xb7ed3000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0&#215;127) = 0xb7ed3000<br />
mmap2(0xb7eda000, 10396, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7eda000<br />
close(3)                                = 0<br />
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7dab000<br />
mprotect(0xb7ed3000, 20480, PROT_READ)  = 0<br />
set_thread_area({entry_number:-1 -&gt; 6, base_addr:0xb7dab8e0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0<br />
munmap(0xb7edd000, 45513)               = 0<br />
brk(0)                                  = 0x804a000<br />
brk(0x806b000)                          = 0x806b000<br />
<span style="color: #ff0000;">stat64(&#8220;/home/ftp/upload&#8221;, {st_mode=S_IFDIR|0777, st_size=4096, &#8230;}) = 0</span><br />
fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 5), &#8230;}) = 0<br />
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7ee8000<br />
write(1, &#8220;16895\n&#8221;, 616895<br />
)                  = 6<br />
write(1, &#8220;/home/ftp/upload is a diretory.\n&#8221;, 32/home/ftp/upload is a diretory.<br />
) = 32<br />
munmap(0xb7ee8000, 4096)                = 0<br />
exit_group(0)                           = ?<br />
Process 32729 detached<br />
jarod@zhenwan:~$</p>
<p>可以看出来其中<span style="color: #ff0000;">红色</span>的一行即是由程序中的 stat() 系统调用所产生。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jarodwang.cn/2008/12/11/a-sample-program-for-stat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux system calls</title>
		<link>http://www.jarodwang.cn/2008/03/13/linux-system-calls/</link>
		<comments>http://www.jarodwang.cn/2008/03/13/linux-system-calls/#comments</comments>
		<pubDate>Thu, 13 Mar 2008 13:59:43 +0000</pubDate>
		<dc:creator>jarodwang</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[strace]]></category>

		<guid isPermaLink="false">http://www.jarodwang.cn/2008/03/13/linux-system-calls/</guid>
		<description><![CDATA[最近学习了在Linux平台上使用strace来观察程序所调用的系统调用，它给出的输出中涉及到了很多Linux平台的系统调用，这里我搜集了一些常见的，以备参考： int access (const char *pathname, int mode); 检查当前用户对于文件所拥有的权限（R_OK, W_OK, X_OK），或是检查文件是否存在（F_OK） int fcntl (int fd, int cmd, long arg); 操作文件描述符fd对应的文件 int fstat (int fd, struct stat *buf); 返回文件描述符fd对应的文件的状态 long getcwd (char *buf, unsigned long size); 获取当前工作目录的绝对路径 int getrlimit (int resource, struct rlimit *rlim); 获取资源限制 off_t lseek (int fd, off_t offset, int whence); 重定位读写文件时的偏移量（offset） ssize_t read [...]]]></description>
			<content:encoded><![CDATA[<p>最近学习了在Linux平台上使用<a href="http://en.wikipedia.org/wiki/Strace" title="strace">strace</a>来观察程序所调用的系统调用，它给出的输出中涉及到了很多Linux平台的系统调用，这里我搜集了一些常见的，以备参考：</p>
<p>int access (const char *pathname, int mode);</p>
<p>检查当前用户对于文件所拥有的权限（R_OK, W_OK, X_OK），或是检查文件是否存在（F_OK）</p>
<p>int fcntl (int fd, int cmd, long arg);</p>
<p>操作文件描述符fd对应的文件</p>
<p>int fstat (int fd, struct stat *buf);</p>
<p>返回文件描述符fd对应的文件的状态</p>
<p>long getcwd (char *buf, unsigned long size);</p>
<p>获取当前工作目录的绝对路径</p>
<p>int getrlimit (int resource, struct rlimit *rlim);</p>
<p>获取资源限制</p>
<p>off_t lseek (int fd, off_t offset, int whence);</p>
<p>重定位读写文件时的偏移量（offset）</p>
<p>ssize_t read (int fd, void *buf, size_t count);</p>
<p>从文件描述符fd对应的文件读</p>
<p>int statfs (const char *path, struct statfs *buf);</p>
<p>获取文件系统统计数据</p>
<p>int uname (struct utsname *buf);</p>
<p>返回系统信息</p>
<p>ssize_t write (int fd, const void *buf, size_t count);</p>
<p>向文件描述符fd对应的文件写</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jarodwang.cn/2008/03/13/linux-system-calls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
