当前位置: 技术问答>linux和unix
请教一个关于进程的问题
来源: 互联网 发布时间:2014-11-24
本文导语: 我想实现一种情况,要求如下 一个程序只fork最多五个进程,如果发现已经fork了五个进程 则不再继续fork,除非某个子进程结束,此时在唤醒父进程继续 fork。 请问如何实现最简单? 顺便问一下: 子进程是否会把父...
我想实现一种情况,要求如下
一个程序只fork最多五个进程,如果发现已经fork了五个进程
则不再继续fork,除非某个子进程结束,此时在唤醒父进程继续
fork。
请问如何实现最简单?
顺便问一下:
子进程是否会把父进程的信号量等信息也复制一份,意思就是问
父进程和子进程是否使用的是同一套信号量?
一个程序只fork最多五个进程,如果发现已经fork了五个进程
则不再继续fork,除非某个子进程结束,此时在唤醒父进程继续
fork。
请问如何实现最简单?
顺便问一下:
子进程是否会把父进程的信号量等信息也复制一份,意思就是问
父进程和子进程是否使用的是同一套信号量?
|
创建
semget()
加
semopt
lock_it.sem_op = +1;
减
semopt
lock_it.sem_op = -1;
一个例子socket的线程server
#include
#include
#include
#include
#include
#include
#include
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
/* union semun is defined by including */
#else
/* according to X/OPEN we have to define it ourselves */
union semun {
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */
unsigned short int *array; /* array for GETALL, SETALL */
struct seminfo *__buf; /* buffer for IPC_INFO */
};
#endif
#define MYPORT 8113 /*服务器监听端口号 */
#define BACKLOG 10 /* 最大同时连接请求数 */
#define MAXCONNECT 10
#define MAX_LEN 1024
#define BUFF_MUTEX 0
#define BUFF_STORED 1
#define SVSEM 0x20020521
pthread_t tid[MAXCONNECT*2],tuse[MAXCONNECT];
typedef struct t_msgQue{
int semId;
char buff[MAX_LEN];
}MsgQue;
MsgQue msgQue[MAXCONNECT];
void *ServerRecv(void *arg);
void *ServerSend(void *arg);
int main()
{
int new_fd,i;
struct sockaddr_in my_addr; /* 本机地址信息 */
struct sockaddr_in their_addr; /* 客户地址信息 */
int sockfd,fd2; /* 监听socket: sock_fd,数据传输socket:new_fd*/
int sin_size=1;
union semun options;
ushort init[2]={1,0};
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { /*错误检测 */
perror("socket");
return 1;
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
memset(&(my_addr.sin_zero),0,8);
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&sin_size,sizeof(int))==-1)/*地址可重用*/
{
perror("setsockopt");
return 1;
}
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {/*错误检测*/
perror("bind");
return 1;
}
if (listen(sockfd, BACKLOG) == -1) {/*错误检测*/
perror("listen");
return 1;
}
for(i=0;i0)
{
options.array = init;
if(semctl(msgQue[i].semId, 0, SETALL, options)==-1)
{
perror("semctl");
exit(1);
}
}
else
{
printf("Error: can't create semId[%d]n",i);
exit(1);
}
}
memset(tuse,0,MAXCONNECT*sizeof(pthread_t));
sin_size = sizeof(struct sockaddr_in);
for(;;)
{
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,&sin_size)) == -1) {
perror("accept");
return 1;
}
printf("nserver: got connection from %sn",inet_ntoa(their_addr.sin_addr));
printf("server: new_fd= %dn",new_fd);
/*
for(i=0;i
semget()
加
semopt
lock_it.sem_op = +1;
减
semopt
lock_it.sem_op = -1;
一个例子socket的线程server
#include
#include
#include
#include
#include
#include
#include
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
/* union semun is defined by including */
#else
/* according to X/OPEN we have to define it ourselves */
union semun {
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */
unsigned short int *array; /* array for GETALL, SETALL */
struct seminfo *__buf; /* buffer for IPC_INFO */
};
#endif
#define MYPORT 8113 /*服务器监听端口号 */
#define BACKLOG 10 /* 最大同时连接请求数 */
#define MAXCONNECT 10
#define MAX_LEN 1024
#define BUFF_MUTEX 0
#define BUFF_STORED 1
#define SVSEM 0x20020521
pthread_t tid[MAXCONNECT*2],tuse[MAXCONNECT];
typedef struct t_msgQue{
int semId;
char buff[MAX_LEN];
}MsgQue;
MsgQue msgQue[MAXCONNECT];
void *ServerRecv(void *arg);
void *ServerSend(void *arg);
int main()
{
int new_fd,i;
struct sockaddr_in my_addr; /* 本机地址信息 */
struct sockaddr_in their_addr; /* 客户地址信息 */
int sockfd,fd2; /* 监听socket: sock_fd,数据传输socket:new_fd*/
int sin_size=1;
union semun options;
ushort init[2]={1,0};
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { /*错误检测 */
perror("socket");
return 1;
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
memset(&(my_addr.sin_zero),0,8);
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&sin_size,sizeof(int))==-1)/*地址可重用*/
{
perror("setsockopt");
return 1;
}
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {/*错误检测*/
perror("bind");
return 1;
}
if (listen(sockfd, BACKLOG) == -1) {/*错误检测*/
perror("listen");
return 1;
}
for(i=0;i0)
{
options.array = init;
if(semctl(msgQue[i].semId, 0, SETALL, options)==-1)
{
perror("semctl");
exit(1);
}
}
else
{
printf("Error: can't create semId[%d]n",i);
exit(1);
}
}
memset(tuse,0,MAXCONNECT*sizeof(pthread_t));
sin_size = sizeof(struct sockaddr_in);
for(;;)
{
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,&sin_size)) == -1) {
perror("accept");
return 1;
}
printf("nserver: got connection from %sn",inet_ntoa(their_addr.sin_addr));
printf("server: new_fd= %dn",new_fd);
/*
for(i=0;i