- 论坛徽章:
- 0
|
1 fork.c
#include stdio.h>
#include sys/types.h>
#include unistd.h>
int main ()
{
pid_t child_pid;
printf ("the main program process ID is %d\n", (int) getpid ());
child_pid = fork ();
if (child_pid != 0) {
printf ("this is the parent process, with id %d\n", (int) getpid ());
printf ("the child's process ID is %d\n", (int) child_pid);
}
else
printf ("this is the child process, with id %d\n", (int) getpid ());
return 0;
}
2 for_exec.c
#include stdio.h>
#include stdlib.h>
#include string.h>
#include unistd.h>
char command[256];
int main(int argc, char *argv[])
{
int rtn; /*子进程的返回数值*/
while(1) {
/* 从终端读取要执行的命令 */
printf( ">" );
fgets( command, 256, stdin );
command[strlen(command)-1] = 0;
if ( fork() == 0 ) {
/* 子进程执行此命令 */
execlp( command, command );
/* 如果exec函数返回,表明没有正常执行命令,打印错误信息*/
perror( command );
exit (0);
}
else {
/* 父进程, 等待子进程结束,并打印子进程的返回值 */
wait ( &rtn );
printf( " child process return %d\n",rtn );
}
}
}
3 fork_exec1.c
#include stdio.h>
#include stdlib.h>
#include sys/types.h>
#include unistd.h>
/* 产生一个新进程运行新的程序。PAORGAM
* 是要运行的程序的名字;系统会在执行路径中搜索这个程序运行。ARG_LIST 是一个以 NULL
* 指针结束的字符串列表,用作程序的参数列表。返回新进程的 ID。 */
int spawn (char* program, char** arg_list)
{
pid_t child_pid;
/* 复制当前进程。*/
child_pid = fork ();
if (child_pid != 0)
/* 这里是父进程。*/
return child_pid;
else {
/* 现在从执行路径中查找并执行 PROGRAM。*/
execvp (program, arg_list);
/* execvp 函数仅当出现错误的时候才返回。*/
fprintf (stderr, "an error occurred in execvp\n");
abort ();
}
}
int main ()
{
int child_status;
/* 准备传递给 ls 命令的参数列表 */
char* arg_list[] = {
"ls", /* argv[0], 程序的名称 */
"-l",
"/",
NULL /* 参数列表必须以 NULL 指针结束 */
};
/* 建立一个新进程运行 ls 命令。忽略返回的进程 ID */
spawn ("ls", arg_list);
/* 等待子进程结束。*/
wait (&child_status);
printf ("done with main program\n");
return 0;
}
4 daemon.c
#include stdio.h>
#include stdlib.h>
#include string.h>
#include fcntl.h>
#include sys/types.h>
#include unistd.h>
#include sys/wait.h>
#define MAXFILE 65535
int main()
{
pid_t pc;
int i, fd, len;
char *buf = "This is a Daemon\n";
len = strlen(buf);
/*第一步*/
pc = fork();
if (pc 0) {
printf("error fork\n");
exit(1);
} else if (pc > 0)
exit(0);
/*第二步*/
setsid();
/*第三步*/
chdir("/");
/*第四步*/
umask(0);
for (i = 0; i MAXFILE; i++)
/*第五步*/
close(i);
while(1) {
if ((fd = open ("/tmp/daemon.log",O_CREAT|O_WRONLY|O_APPEND,0600)) 0 ) {
perror("open");
exit(1);
}
write(fd, buf, len + 1);
close(fd);
sleep(10);
}
}
5 make_zomb.c
#include stdlib.h>
#include sys/types.h>
#include unistd.h>
int main ()
{
pid_t child_pid;
/* 创建一个子进程 */
child_pid = fork ();
if (child_pid > 0) {
/*这是父进程。休眠一分钟。 */
sleep (60);
}
else {
/*这是子进程。立刻退出。 */
exit (0);
}
return 0;
}
6 sigchld.c
#include signal.h>
#include string.h>
#include sys/types.h>
#include sys/wait.h>
sig_atomic_t child_exit_status;
void clean_up_child_process (int signal_number)
{
/* 清理子进程。*/
int status;
wait (&status);
/* 在全局变量中存储子进程的退出代码。*/
child_exit_status = status;
}
int main ()
{
/* 用 clean_up_child_process 函数处理 SIGCHLD。*/
struct sigaction sigchild_action;
memset (&sigchild_action, 0, sizeof (sigchild_action));
sigchild_action.sa_handler = &clean_up_child_process;
sigaction (SIGCHLD, &sigchild_action, NULL);
/* 现在进行其它工作,包括创建一个子进程。*/
/* ... */
return 0;
}
7
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/43090/showart_2167630.html |
|