20135316王剑桥 linux第十一周课实验笔记

getenv函数
1.获得环境变量值的函数
2.参数是环境变量名name,例如”HOME”或者”PATH”。如果环境变量存在,那么getenv函数会返回环境变量值,即value的首地址;如果环境变量不存在,那么getenv函数返回NULL
setenv函数
1.修改或添加环境变量的函数
2.将name设置成value
 
1.如果name在环境中不存在,那么很好办,在环境中添加这个新的变量就OK。
setenv函数必须在environment list中增加一个新的entry,然后动态申请存储空间来存储name=value,并且使entry指向该空间。
2.如果在环境中name已经存在,那么

(a)若overwrite非0,那么更新name的value(实质是更新环境表,指向新的value);

(b)若overwrite为0,则环境变量name不变,并且也不出错。

setenv函数不必在environment list中增加一个新的entry。当overwrite为0, 则不必改动entry的指向;当overwrite非0, 则直接使该entry指向name=value,当然该name=value也是存储在动态申请的内存里。

sigactdemo2

include #include #include

void sig_alrm( int signo ){
/do nothing/
}
unsigned int mysleep(unsigned int nsecs){
struct sigaction newact, oldact;
unsigned int unslept;

newact.sa_handler = sig_alrm;
sigemptyset( &newact.sa_mask );
newact.sa_flags = 0;
sigaction( SIGALRM, &newact, &oldact );

alarm( nsecs );
pause();

unslept = alarm ( 0 );
sigaction( SIGALRM, &oldact, NULL );

return unslept;

}
int main( void ){
while( 1 )
{
mysleep( 2 );
printf( "Two seconds passed\n" );
}
return 0;
}
20135316王剑桥 linux第十一周课实验笔记_第1张图片

每两秒输出一次

sigdemo1

include #include void f(int); int main(){

int i;
signal( SIGINT, f );        
for(i=0; i<5; i++ ){        
    printf("hello\n");
    sleep(2);
}

return 0;

}
void f(int signum) {
printf("OUCH!\n");
}
20135316王剑桥 linux第十一周课实验笔记_第2张图片

连续输出五个hello,每两个间隔是两秒
在这期间,每次输入的Ctrl+C都被处理成打印OUCH

.testbuf3.c文件

include

 
int main()
{
    fprintf(stdout, "1234", 5);
    fprintf(stderr, "abcd", 4);
}
【关于fprintf函数】
函数原型:int fprintf(FILE stram,const char format,[argument]);第一个参数是文件指针,第二是输出格式,第三个是附加参数列表。也就是说,该函数会根据指定的格式(format)向输出流(stream)中写入数据(argument)。

fifo
生产者和消费者问题

20135316王剑桥 linux第十一周课实验笔记_第3张图片

forkdemo3
 
代码如下:
 

include #include #include

int main()
{
int fork_rv;

printf("Before: my pid is %d\n", getpid());

fork_rv = fork();       /* create new process   */

if ( fork_rv == -1 )        /* check for error  */
    perror("fork");
else if ( fork_rv == 0 ){ 
    printf("I am the child.  my pid=%d\n", getpid());

    exit(0);
}
else{
    printf("I am the parent. my child is %d\n", fork_rv);
    exit(0);
}

return 0;

}
 
fork产生子进程,父进程返回子进程pid,不为0,所以输出父进程的那句话,子进程返回0,所以会输出子进程那句话。
 
结果如下:

你可能感兴趣的:(20135316王剑桥 linux第十一周课实验笔记)