linux 0.11 ÄÚºËѧϰ pipe.c
/*
* ¸ÃÎļþÖеÄÁ½¸öº¯Êýread_pipeºÍwrite_pipeÊÇÉϲ㺯Êý
* readºÍwriteµÄµ×²ãʵÏÖ
*/
/*
* linux/fs/pipe.c
*
* (C) 1991 Linus Torvalds
*/
#include <signal.h>
#include <linux/sched.h>
// ÄÚ´æ¹ÜÀíÍ·Îļþ¡£º¬ÓÐÒ³Ãæ´óС¶¨ÒåºÍÒ»Ð©Ò³ÃæÊͷź¯ÊýÔÐÍ
#include <linux/mm.h> /* for get_free_page */
#include <asm/segment.h>
/* pipeÀàËÆÓÚ¶ÓÁУ¬ÏòpipeµÄβ²¿Ð´ÈëÊý¾Ý£¬´ÓpipeµÄÍ·²¿¶ÁÈ¡Êý¾Ý */
/* ¹ÜµÀ¶Á²Ù×÷º¯Êý */
/* ²ÎÊýinode ÊǹܵÀ¶ÔÓ¦µÄi ½Úµã£¬buf ÊÇÊý¾Ý»º³åÇøÖ¸Õ룬count ÊǶÁÈ¡µÄ×Ö½ÚÊý */
/*
* read_pipe()º¯ÊýÓÃÓÚ¶ÁÈ¡¹ÜµÀÖеÄÊý¾Ý£¬Èç¹û¹ÜµÀÖÐûÓÐÊý¾ÝµÄ»°£¬
* »½ÐÑд¹ÜµÀ½ø³Ì£¬×Ô¼ºË¯Ãߣ¬Èç¹û¶Áµ½Êý¾Ý£¬²¢°ÑÊý¾Ý´«µ½Óû§»º³åÇø£¬
* µ±°Ñ¹ÜµÀÖÐËùÓеÄÊý¾Ý¶¼È¡×ߺó£¬Ò²Òª»½Ðѵȴýд¹ÜµÀµÄ½ø³Ì£¬²¢·µ»Ø
* ÒѶÁÊý¾Ý×Ö½ÚÊý
*/
int read_pipe(struct m_inode * inode, char * buf, int count)
{
int chars, size, read = 0;
while (count>0)
{
// Èôµ±Ç°¹ÜµÀÖÐûÓÐÊý¾Ý(size=0)£¬Ôò»½Ðѵȴý¸Ã½ÚµãµÄ½ø³Ì
while (!(size=PIPE_SIZE(*inode)))
{
wake_up(&inode->i_wait);
// Èç¹ûÒÑûÓÐд¹ÜµÀÕß
if (inode->i_count != 2) /* are there any writers? */
return read; // ·µ»ØÒѶÁ×Ö½ÚÊý
// ·ñÔòÔÚ¸Ãi ½ÚµãÉÏ˯Ãߣ¬µÈ´ýÐÅÏ¢
sleep_on(&inode->i_wait);
}
// È¡¹ÜµÀβµ½»º³åÇøÄ©¶ËµÄ×Ö½ÚÊýchars
chars = PAGE_SIZE-PIPE_TAIL(*inode);
if (chars > count)
chars = count;
if (chars > size)
chars = size;
// ¶Á×Ö½Ú¼ÆÊý¼õÈ¥´Ë´Î¿É¶ÁµÄ×Ö½ÚÊýchars£¬²¢ÀÛ¼ÓÒѶÁ×Ö½ÚÊý
count -= chars;
read += chars;
// Áîsize Ö¸Ïò¹ÜµÀβ²¿£¬µ÷Õûµ±Ç°¹ÜµÀβָÕë£¨Ç°ÒÆchars ×Ö½Ú£©
size = PIPE_TAIL(*inode);
PIPE_TAIL(*inode) += chars;
PIPE_TAIL(*inode) &= (PAGE_SIZE-1);
// ½«¹ÜµÀÖеÄÊý¾Ý¸´ÖƵ½Óû§»º³åÇøÖÐ
while (chars-->0)
put_fs_byte(((char *)inode->i_size)[size++],buf++);
}
// »½Ðѵȴý¸Ã¹ÜµÀi ½ÚµãµÄ½ø³Ì
wake_up(&inode->i_wait);
// ·µ»Ø¶ÁÈ¡µÄ×Ö½ÚÊý
return read;
Ïà¹ØÎĵµ£º
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory */
#define ESRCH&nbs ......
Ìõ¼þ±äÁ¿Í¨¹ýÔÊÐíÏß³Ì×èÈûºÍµÈ´ýÁíÒ»¸öÏ̷߳¢ËÍÐźŵķ½·¨ÃÖ²¹ÁË»¥³âËøµÄ²»×㣬Ëü³£ºÍ»¥³âËøÒ»ÆðʹÓá£Ê¹ÓÃʱ£¬Ìõ¼þ±äÁ¿±»ÓÃÀ´×èÈûÒ»¸öỊ̈߳¬µ±Ìõ¼þ²»Âú×ãʱ£¬Ïß³ÌÍùÍù½â¿ªÏàÓ¦µÄ»¥³âËø²¢µÈ´ýÌõ¼þ·¢Éú±ä»¯¡£Ò»µ©ÆäËüµÄij¸öÏ̸߳ıäÁËÌõ¼þ±äÁ¿£¬Ëü½«Í¨ÖªÏàÓ¦µÄÌõ¼þ±äÁ¿»½ÐÑÒ»¸ö»ò¶à¸öÕý±»´ËÌõ¼þ±äÁ¿×èÈûµ ......
#include
#include
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void *thread1(void *);
void *thread2(void *);
int i=1;
main(void)
{
pthread_t t_a;
pthread_t t_b;
pthread_create(&t_a,NULL,thread1,(void *)NULL) ......
stroul£¬
strdup
snprintf()
atio
CÖг£ÓÃ×Ö·û´®²Ù×÷º¯Êý
#include <string.h>
size_t strlen(const char *s) ²âÁ¿×Ö·û´®³¤¶ÈsµÄʵ¼Ê³¤¶È¡£
ÀýÈçs[20]="abc",ÄÇôstrlen(s)µÄ½á¹ûÊÇ3£¬¶ø²»ÊÇ20.Õâ¾ÍÊÇʵ¼Ê³¤¶È
char *strcat(const char *s1, const *s2) ......
/*
* buffer.c ³ÌÐòÓÃÓÚ¶Ô¸ßËÙ»º³åÇø(³Ø)½øÐвÙ×÷ºÍ¹ÜÀí¡£¸ßËÙ»º³å
* ÇøÎ»ÓÚÄں˴úÂëºÍÖ÷ÄÚ´æÇøÖ®¼ä¡£
*
* |---|---|------------------|---------------------|-------------------|
* | | | * * * | &nbs ......